2017-10-17 189 views
1

我目前正試圖教自己如何使用活動,但我似乎無法讓一切正常工作。學習活動

與事件編碼看起來像這樣的類:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace EventsPractice 
{ 
    public delegate void myEventHandler(string newValue); 

    public class EventExample 
    { 
     private string _value; 
     public event myEventHandler valueChanged; 

     public string val 
     { 
      set 
      { 
       _value = value; 
       valueChanged(_value); 
      } 
     } 

     static void myEvt_valueChanged(string newValue) 
     { 
      Console.WriteLine("The value changed to {0}", newValue); 
     } 
    } 
} 

我的計劃類看起來是這樣的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using EventsPractice; 

namespace EventsPractice 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      EventExample myEvt = new EventExample(); 

      myEvt.valueChanged += myEventHandler(myEvt_valueChanged); 

      string str; 
      do 
      { 
       str = Console.ReadLine(); 
       if (!str.Equals("exit")) 
        myEvt.val = str; 
      } while (!str.Equals("exit")); 

     } 
    } 
} 

我收到的錯誤是:

「錯誤1' EventsPractice.myEventHandler'是一個'類型',但像'變量'一樣使用C:\ Users \ Administrator \ Documents \ Visual Studio 2010 \ Projects \ EventsPractice \ EventsPractice \ Program.cs 15 35 EventsPractice「

錯誤2名 'myEvt_valueChanged' 在目前情況下C不存在:\用戶\管理\文檔\ Visual Studio 2010的\項目\ EventsPractice \ EventsPractice \的Program.cs 15 50 EventsPractice

我不確定我錯過了什麼或者我錯了什麼地方。任何幫助,將不勝感激。

回答

0

在你必須把一個方法(或λ)具有相同簽名的delegate,有點像+=的右手:

myEvt.valueChanged += (val) => { Console.WriteLine("Value is now {0}", val); } 

private void SomeMethod(string val) { 
    Console.WriteLine("Value is now {0}", val); 
} 

myEvt.valueChanged += SomeMethod; 
1

的用於訂閱事件的語法要求您在+=運算符的右側提供委託對象的實例。表達式myEventHandler(myEvt_valueChanged);根本沒有意義,不用擔心它提供了必要的委託實例。

另一個問題是標識符myEvt_valueChanged在您嘗試使用它的地方無效。這個名字的方法是在一個完全不同的類中聲明的,所以如果你想在類之外使用它,那麼必須用類名來限定。這樣編譯器就可以知道在哪裏找到該方法。

改變你的代碼將添加new運營商,像這樣簡單的方法:

myEvt.valueChanged += new myEventHandler(EventExample.myEvt_valueChanged); 

這將明確創建myEventHandler委託類型的實例,使用方法myEvt_valueChangedEventExample類。然而,C#提供了一個更簡潔的語法將在其中推斷委託類型和new運營商代表您,基於表達式的左手側:

myEvt.valueChanged += EventExample.myEvt_valueChanged; 

注意,當你寫這樣,它仍然在做着完全一樣的事情,就像你明確地寫完整件事情一樣。只是編譯器正在爲你填充顯而易見的部分。

最後,我會指出,事件是最經常使用的,通過訂閱方法而不是來自同一個事件聲明的類。你上面的例子會比較典型的,如果myEvt_valueChanged方法是在Program類,如果它在那裏,而不是,你就不需要它訂閱事件時指定的類名:

myEvt.valueChanged += myEvt_valueChanged;