应该将关键字添加到C#中以提升事件吗?
以线程安全方式提升事件(以避免NullReferenceException
)需要在调用事件委托之前复制该事件委托:
EventHandler copy = TheEvent;
if (copy != null)
copy(this, EventArgs.Empty);
或者使用Jon Skeet提出的C#6中的空条件运算符和Volatile.Read
:
Volatile.Read(ref TheEvent)?.Invoke(this, EventArgs.Empty);
(有关讨论,请参阅C#事件和线程安全性)。
这是乏味和容易出错的。 向C#中添加一个raise
关键字是否没有意义,以便上述模式(或由C#编译器团队选择的改进模式)将由编译器进行透明处理,例如
raise TheEvent(this, EventArgs.Empty);
这将是一种符合using
和async
/ await
的句法便利,它可以解决以最终方式提出事件的正确方式的困惑。
有什么缺点?
编辑
感谢大家的反馈意见 - 添加另一个关键字确实有点极端。
然而,由于缺乏提升事件的“标准”方式,并且像Raise()
扩展方法一样多,所以我建议将它添加到Visual Studio UserVoice频道的mscorlib
中。
这是真的很容易出错或混乱吗? 即使他们确实添加了这样一个关键字,他们仍然必须保持提高兼容性的旧方式,并且您必须知道提升事件的正确方法。 您可以创建如下所示的扩展方法来完成大部分工作:
public static void Raise(this EventHandler handler, object sender, EventArgs args)
{
if (handler != null)
{
handler(sender, args);
}
}
我宁愿看到编译器团队努力让不可能的东西成为可能,而不是将代码基数减少几行。
链接地址: http://www.djcxy.com/p/52935.html