使用no-op lambda表达式初始化事件是否会阻止GC?

Sté*_*écy 2 c# events lambda

可以使用以下构造来声明事件:

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不再被其他对象引用了......任何人都可以确认或证明不是吗?

Jon*_*eet 6

MyClass即使您没有删除"真正的"处理程序,也可以收集实例.

事件的正常"泄漏"是事件发布者(MyClass在这种情况下)通过订阅的事件处理程序引用另一个对象.事件不会阻止发布者被垃圾回收.无操作的lambda肯定对此没有影响.