C#中的触发事件
Firing events in C#
我注意到在我看到的所有 C# 事件示例中,触发事件的写法如下:
PropertyChangedEventHandler handler = PropertyChanged;
if(handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
那和写有什么区别:
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
在您的第二个示例中,您调用了 PropertyChanged
的 getter 两次。在多线程环境中,值可能会在调用之间更改。
在您的第一个示例中,通过首先制作本地副本来防止这种情况。
在第二种情况下,如果您是 运行 多线程,PropertyChanged
的值可能会在 if
和调用之间发生变化。不推荐。
您也可以尝试初始化您的事件处理程序,使其具有像这样的空处理程序:
public EventHandler<PropertyChangeEventArgs> PropertyChanged = (s, e) => { };
这意味着它永远不会为空,因此您可以按原样触发它。
我注意到在我看到的所有 C# 事件示例中,触发事件的写法如下:
PropertyChangedEventHandler handler = PropertyChanged;
if(handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
那和写有什么区别:
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
在您的第二个示例中,您调用了 PropertyChanged
的 getter 两次。在多线程环境中,值可能会在调用之间更改。
在您的第一个示例中,通过首先制作本地副本来防止这种情况。
在第二种情况下,如果您是 运行 多线程,PropertyChanged
的值可能会在 if
和调用之间发生变化。不推荐。
您也可以尝试初始化您的事件处理程序,使其具有像这样的空处理程序:
public EventHandler<PropertyChangeEventArgs> PropertyChanged = (s, e) => { };
这意味着它永远不会为空,因此您可以按原样触发它。