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) => { };

这意味着它永远不会为空,因此您可以按原样触发它。