编程技术网

关注微信公众号,定时推送前沿、专业、深度的编程技术资料。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

极客时间

扩展方法线程安全吗?:Is Extension method thread safe?

omicron-b 线程 2022-5-11 19:29 6人围观

腾讯云服务器
扩展方法线程安全吗?的处理方法

此扩展方法线程安全吗?

Is this Extension method thread safe?

 public static class Extensions { public static void Raise<T>(this EventHandler<T> handler, object sender, T args) where T : EventArgs { if (handler != null) handler(sender, args); } } 

还是我需要将其更改为此?

or do I need to change it to this?

 public static class Extensions { public static void Raise<T>(this EventHandler<T> handler, object sender, T args) where T : EventArgs { var h = handler; if (h!= null) h(sender, args); } } 

问题解答

您发现了一个有趣的循环漏洞,它使所有人绊倒了.不,它不是线程安全的.

You found an interesting loop hole, it tripped everybody up. No, it is not thread-safe.

看起来就像通过方法参数复制了EventHandler<>引用一样,但在运行时不会发生这种情况.扩展方法需要内联,就像常规实例方法一样.实际上,由于它很小,很可能非常被内联.没有副本,您必须自己制作.

While it looks like the EventHandler<> reference is copied through the method argument, this is not what happens at runtime. Extension methods are subject to being inlined, just like a regular instance method. In fact, it is extremely likely to get inlined since it is so small. There's no copy, you have to make one yourself.

这篇关于扩展方法线程安全吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程技术网(www.editcode.net)!

腾讯云服务器 阿里云服务器
关注微信
^