2015-07-21 24 views
2

我有下面的代码,它有一个'PropertyChangedEventHandler'。我看到它有一个属性PropertyChangedEventHandler,但我没有看到任何它调用'新的PropertyChangedEventHandler'?当我不需要它时,是否需要'引用'参考?PropertyChangedEventHandler是如何在C#中创建和释放的?

public abstract class MyClass: INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler eventHandler;  
} 
+0

可能的重复[了解C#中的事件和事件处理程序](http://stackoverflow.com/questions/803242/understanding-events-and-event-handlers-in-c-sharp) – poke

回答

3

当您声明一个事件时,编译器会自动创建一个名为“add”和“remove”的目标委托类型和两个包装器方法的支持字段。当您订阅该事件时,“add”方法在内部被调用,并且如果尚未创建,它会创建底层代理的实例(在这种情况下为PropertyChangedEventHandler)。

当您取消订阅该事件时,会在内部调用“remove”方法。如果没有更多订户,则在“remove”方法中,底层代理字段会自动设置为null。所以你不需要明确地设置它为空。

这就是您在提出事件之前需要检查空引用的原因,因为如果没有订阅者,则基础字段将为空。

+0

我在调查为什么PropertyChangedEventHandler对象不会被释放。我怀疑代码中还有一些用户正在被保存(不正确),导致PropertyChangedEventHandler不能被释放。有没有办法检查PropertyChangedEventHandler有多少用户? – n179911

1

这是宣布为event。默认情况下,会自动创建一个事件作为可以添加和删除代理的多播委托。

所以不,你不需要做任何事情。该框架将初始化并酌情释放它。