2017-10-17 190 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;