事件驱动编程

JSh*_*ell 4 c#

我一直在阅读这篇MSDN文章这个问题,试图理解.NET中的事件.不幸的是,它没有点击我,我遇到了很多麻烦.我正在尝试将这项技术整合到我的项目中,但收效甚微.

基本上,我有这个类会读数字.每当遇到一个新号码时,我希望它触发一个名为numberChanged的事件.

所以,我设置了我的活动public event EventHandler numberChanged;.稍后,当我遇到一个与前一个数字不同的数字时,我会触发它.

if(currentNumber != previousNumber){
     if(numberChanged != null){
          numberChanged(this, new EventArgs());
     }
}
Run Code Online (Sandbox Code Playgroud)

但后来我遇到了麻烦'subcibing'这个事件.如果我这样做numberChanged += [something to do here]错误,说numberChanged是一个事件而不是一个类型.

我的解释是否足够明确,可以提供一些建议?非常感谢.

Ron*_*yer 6

有很多方法可以处理它,最基本的是创建一个函数:

public void MyNumberChangedHandler(object sender, EventArgs e)
{
    //Your code goes here that gets called when the number changes
}
Run Code Online (Sandbox Code Playgroud)

然后你通过以下方式订阅(仅一次,通常在构造函数中):

numberChanged += MyNumberChangedHandler;
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用称为匿名(lambda)方法的方法,该方法也在构造函数中指定(通常):

numberChanged += (sender, e) => {
    //Your code here to handle the number changed event
};
Run Code Online (Sandbox Code Playgroud)

为了扩展一点,在使用lambda方法时必须小心,因为你可以创建内存泄漏和僵尸对象..NET内存垃圾收集器是一种标记和扫描系统,可在不再使用对象时删除它们.这篇文章显示了删除lambda事件处理程序的难度:如何删除lambda事件处理程序.

拥有一个活动的事件处理程序可以使你的对象保持活着,即使它已被处理掉 以下是创建僵尸对象的示例(不在Fiddle中运行,但您可以复制到自己的控制台应用程序)https://dotnetfiddle.net/EfNpZ5

打印出来:

I'm still alive
I'm still alive
I was disposed!
Press any key to quit
I'm still alive
I'm still alive
I'm still alive.

  • @ sab669这只是C#2.0中引入的一种语法糖 (2认同)