Csharp/C#教程:这是在C#中没有空检查的情况下触发/调用事件的更好方法吗?分享


这是在C#中没有空检查的情况下触发/调用事件的更好方法吗?

我见过的大多数代码使用以下方式来声明和调用事件触发:

public class MyExample { public event Action MyEvent; // could be an event EventHandler, too private void OnMyEvent() { var handler = this.MyEvent; // copy before access (to aviod race cond.) if (handler != null) { handler(); } } public void DoSomeThingsAndFireEvent() { // ... doing some things here OnMyEvent(); } } 

甚至ReSharper也会按照上面提到的方式生成一个调用方法。

为什么不这样做:

 public class MyExample { public event Action MyEvent = delegate {}; // init here, so it's never null public void DoSomeThingsAndFireEvent() { // ... doing some things here OnMyEvent(); // save to call directly because this can't be null } } 

任何人都可以解释为什么不这样做的原因? (亲与利弊)

优点和缺点是:

这肯定是一种风格的东西; 但是,我认为大多数开发人员在进行空检查时都会考虑安全性。 这个世界上没有任何东西可以保证一个bug不会蔓延到系统中,并且无需进行空检查。

它仍然可以为null。 考虑:

  var x = new MyExample(); x.MyEvent += SomeHandler; // ... later, when the above code is disposed of x.MyEvent -= SomeHandler; 

编辑:实际上,我把它拿回来。 测试过此后,如果您使用匿名委托设置处理程序,则看起来不能清除它,因此您可以保存空检查。

我不确定这是否是可靠的行为,或者只是语言实现的工件……

我在简化事件触发时看到的最佳权衡是增加了一个扩展方法。 请参阅使用扩展方法提升C#事件 – 这是不是很糟糕? 。

上述就是C#学习教程:这是在C#中没有空检查的情况下触发/调用事件的更好方法吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/951708.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐