通过呼叫代表来提高事件 - 为什么不通过事件名称?

时间:2017-08-20 06:33:58

标签: c# events

我查看了一段旧代码,但无法理解以下内容:

public event EventHandler NameChanged;
#endregion

#region protected void OnNameChanged(EventArgs args)
/// <summary>
/// Raises NameChanged event.
/// </summary>
/// <param name="args">Event arguments.</param>
protected void OnNameChanged(EventArgs args)
{
    EventHandler eh = this.NameChanged;
    if (eh != null)
    {
        eh(this, args);
    }
}

为什么通过调用委托来引发事件?难道我不能像往常一样简单地调用事件本身(NameChanged)吗?

编辑:我可以在MSDN上看到这个建议:https://docs.microsoft.com/en-us/dotnet/standard/events/

1 个答案:

答案 0 :(得分:3)

每当您引用事件时,实际上都是将调用列表复制到本地引用。 通过这样做,您确保在检查事件eh != null的有效性和调用事件eh(this, args) eh的值之间不会改变(可能来自不同的线程)。

在C#6中,有一个新的运算符https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-conditional-operators

你可以这样做:

NameChanged?.Invoke(this, args);