当我们在写 += 和 -= 事件的时候,我们会在 += 或 -= 的右边写上事件处理函数。我们可以写很多种不同的事件处理函数的形式,那么这些形式都是一样的吗?如果你不注意,可能出现内存泄漏问题。
本文将讲解事件处理函数的不同形式,理解了这些可以避免编写代码的时候出现内存相关的问题。
本文内容 典型的事件处理函数 变种事件处理函数 编译器类型转换 不是同一个委托实例 `+=` `-=` 是怎么做的 `-=`典型的事件处理函数
事件处理函数本质上是一个委托,比如 FileSystemWatcher 的 Changed 事件是这样定义的:
// 这是简化的代码。 public event FileSystemEventHandler Changed; 12
这里的 FileSystemEventHandler 是一个委托类型:
public delegate void FileSystemEventHandler(object sender, FileSystemEventArgs e); 1
一个典型的事件的 += 会像下面这样:
void Subscribe(FileSystemWatcher watcher) { watcher.Changed += new FileSystemEventHandler(OnChanged); } void OnChanged(object sender, FileSystemEventArgs e) { } 12345678910
+= 的右边传入的是一个 new 出来的委托实例。
变种事件处理函数
除了上面直接创建的目标类型的委托之外,还有其他类型可以放到 += 的右边:
// 方法组。 watcher.Changed += OnChanged; 12
// Lambda 表达式。 watcher.Changed += (sender, e) => Console.WriteLine(e.ChangeType); 12
// Lambda 表达式。 watcher.Changed += (sender, e) => { // 事件引发时,代码会在这里执行。 }; 123456
// 匿名方法。 watcher.Changed += delegate (object sender, FileSystemEventArgs e) { // 事件引发时,代码会在这里执行。 }12345