我查看了一段旧代码,但无法理解以下内容:
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/
答案 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);