可以使用以下构造来声明事件:
public class MyClass
{
public event EventHandler<EventArgs> SomeEvent = (s,e) => {};
public void SomeMethod ()
{
// Do something interesting... ;)
SomeEvent (this, new EventArgs);
}
}
Run Code Online (Sandbox Code Playgroud)
这允许在不需要检查事件是否为空的情况下引发事件.
现在,假设一个对象A持有对MyClass对象的引用,为该事件注册,然后稍后取消注册.
var myClass = new MyClass();
myClass.SomeEvent += MyHandler;
...
myClass.SomeEvent -= MyHandler;
myClass = null;
Run Code Online (Sandbox Code Playgroud)
即使事件中仍存在no-op lambda表达式,GC是否会收集myClass?
我想是的,因为对象root不再被其他对象引用了......任何人都可以确认或证明不是吗?
MyClass即使您没有删除"真正的"处理程序,也可以收集实例.
事件的正常"泄漏"是事件发布者(MyClass在这种情况下)通过订阅的事件处理程序引用另一个对象.事件不会阻止发布者被垃圾回收.无操作的lambda肯定对此没有影响.
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |