我见过许多开发人员在想要调用时将Event
其分配给名为handler
并调用的局部变量,handler
而不是Event
直接调用。为什么我们不直接调用事件?
private void OnSomethingChanged(EventArgs e)
{
if (SomethingEvent != null)
{
SomethingEvent(this, e);
}
}
我见过许多开发人员在想要调用时将Event
其分配给名为handler
并调用的局部变量,handler
而不是Event
直接调用。为什么我们不直接调用事件?
private void OnSomethingChanged(EventArgs e)
{
if (SomethingEvent != null)
{
SomethingEvent(this, e);
}
}
您发布的代码基本上不是线程安全的。如果最终订阅者在检查之后但调用之前在不同的线程中取消订阅,您将获得一个.if
NullReferenceException
一种选择是编写扩展方法:
public static void NullSafeInvoke(this EventHandler handler,
object sender, EventArgs e)
{
if (handler != null)
{
handler(this, e);
}
}
然后你可以写:
private void OnSomethingChanged(EventArgs e)
{
SomethingEvent.NullSafeInvoke(this, e);
}
您可能还想要另一个重载EventHandler<T>
。
如果未复制事件(仅与多线程应用程序相关),则可能出现竞争条件。
如果一个线程在检查后立即取消订阅该事件,null
没有订阅任何内容,您将获得一个NullReferenceException
.
我也不明白为什么。有一个简单且相当安全的方法:
// when constructing of instance, to create empty subscription
public event EventHandler SomethingEvent = delegate { };
private void OnSomethingChanged(EventArgs e)
{
// and call it directly
SomethingEvent(this, e);
}