这是在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