应该将关键字添加到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);

这将是一种符合usingasync / 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

上一篇: Should a keyword be added to C# for raising events?

下一篇: Raising an event thread safely