gpt4 book ai didi

c# - C# 中事件的无操作订阅者 - 空检查冗余

转载 作者:太空宇宙 更新时间:2023-11-03 21:17:24 26 4
gpt4 key购买 nike

所以如果我在我的事件声明中做这样的事情:

public event MyDelegate MyEvent = delegate { };

我读到这使得空检查变得多余,将会有一个无操作订阅者。

我很好奇它在幕后是如何工作的。到底发生了什么,这是一个好的做法,还是我应该在触发事件处理程序之前坚持通常的 null 检查?

最佳答案

null 检查并不棘手,因为有一个额外的 if - 它们很棘手,因为它们在多线程环境中不可靠。

这是一个权衡。如果您预计该事件将只有 0-1 个代表,那么使用(安全的)空值检查可能会更好。如果您希望有多个订阅者不断订阅和取消订阅,那么您最好使用“null-delegate”。它确实意味着调用链中有一个额外的委托(delegate),但对于 .NET 中的大多数事件使用而言,这通常足够便宜。

你不会想在例如一个包含 50 个不同事件的控件,其中大部分都没有订阅者,或者您的行为会根据是否有订阅者而改变。

至于引擎盖下发生的事情,好吧……没什么。这没有任何魔力。诀窍在于 += 如何处理事件/委托(delegate)。

如果您有一个 null 事件,并使用 +=,它只是为该事件分配一个新委托(delegate)。如果已经有一个委托(delegate),它将创建一个新的委托(delegate),它是前一个委托(delegate)和新委托(delegate)的组合。如果您使用该空委托(delegate),它只是意味着总有一些委托(delegate)可以组合。调用事件的常用代码如下所示:

var ev = Click;

if (ev != null) ev();

这意味着如果没有事件订阅者,则没有调用。在空委托(delegate)的情况下,代码进一步简化为

Click();

总是 意味着委托(delegate)调用——至少,您的空委托(delegate)被调用。当然,它实际上并没有做任何事情,但是您保留了委托(delegate)调用的开销。同样,这很少成为问题,但在某些情况下这是 Not Acceptable 。

关于c# - C# 中事件的无操作订阅者 - 空检查冗余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33101904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com