gpt4 book ai didi

c# - 这对扩展方法来说是个好主意吗?

转载 作者:行者123 更新时间:2023-11-30 12:15:19 25 4
gpt4 key购买 nike

我经常看到这样的代码分散在源代码周围并重复:

var handler = MyEvent;

if (handler != null)
{
handler.Invoke(null, e);
}

有什么理由不把它封装在像这样的扩展方法中吗?

public static void SafeInvoke<T>(this EventHandler<T> theEvent, object sender, T e) where T : EventArgs
{
var handler = theEvent;

if (handler != null)
{
handler.Invoke(sender, e);
}
}

这样调用就可以像这样:

MyEvent.SafeInvoke(this, new MyEventArgs(myData));

最佳答案

这很有趣。 Jeffrey Richter 在 CLR via C# 中对此进行了很多讨论。

像下面这样的空检查:-

var handler = MyEvent;

if (handler != null)
{
handler.Invoke(null, e);
}

JIT 编译器可能会优化掉 handler完全可变。然而,CLR 团队意识到许多开发人员使用这种模式来引发事件,并将这种意识构建到 JIT 编译器中。这很可能会保留在 CLR 的所有 future 版本中,因为更改行为可能会破坏太多现有应用程序。

您没有理由不能编写扩展方法来为您完成这项工作(这正是我所做的)。请注意,方法本身可能是 JIT 内联的(但临时变量仍然不会被优化掉)。

如果您设想您的应用程序用于另一个运行时,例如Mono(我怀疑在这种情况下无论如何反射(reflect)了 CLR 的行为)或可能出现的其他一些奇特的运行时,那么您可以通过添加 [MethodImplAttribute(MethodImplOptions.NoInlining)] 来保护您的代码免受 JIT 内联的可能性。到您的扩展方法。

如果您决定不使用扩展方法,另一种防止 JIT 优化的方法(Jeffrey Richter 推荐)是以 JIT 编译器无法优化的方式将值分配给临时变量,例如

var handler = Interlocked.CompareExchange(ref MyEvent, null, null);

关于c# - 这对扩展方法来说是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7592186/

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