在C#中发射事件

时间:2015-04-23 13:26:29

标签: c# events

我已经注意到在C#中发现事件的所有样本中,触发事件的样本写成:

PropertyChangedEventHandler handler = PropertyChanged;
if(handler != null)
    handler(this, new PropertyChangedEventArgs(propertyName));

只是写作之间有什么不同:

if(PropertyChanged != null)
    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

2 个答案:

答案 0 :(得分:8)

在第二个示例中,您两次调用PropertyChanged的getter。在多线程环境中,可以在调用之间更改值。

在第一个示例中,首先制作本地副本会阻止这种情况。

答案 1 :(得分:4)

在第二种情况下,如果您正在运行多线程,则PropertyChanged的值可能会在if和调用之间发生变化。不建议这样做。

您也可以尝试初始化事件处理程序,使其具有如下所示的空处理程序:

public EventHandler<PropertyChangeEventArgs> PropertyChanged = (s, e) => { };

这意味着它永远不会为null,所以你可以将其解雇为。