事件外部修饰符的目的是什么?
本文关键字:是什么 外部 事件 | 更新日期: 2023-09-27 18:17:56
在浏览c#语言规范5.0时,我意识到可以定义extern event
。我习惯于为平台调用和本机回调外部方法。在我11年的。net世界里,我还没有遇到过这个概念。
-
extern
事件与什么互操作? - 是否提供订阅本地事件的功能?
- 你能发起这样一个事件吗?
- 它解决了什么问题,赢得了它在c#语言中的地位?
我搜索了"extern"的规范,发现属性、索引器、构造函数、静态构造函数、终结器(!)甚至操作符(!)都可以是extern
。字段不能。(我还了解到名称空间别名可以是'extern',但它的含义完全不同。)
编辑:这就说清楚了。因此,extern
并不适用于事件概念或属性概念,而是适用于构成方法。对吗?COM事件与DllImport
事件有什么不同吗?
我以前从未见过这个,搜索并没有真正带来任何实际用途,但可以在Roslyn编译器测试套件中找到它:
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
public class C
{
[method: DllImport("c")]
public extern static event System.Action G;
}
测试验证了这会从c
DLL导入add_G
和remove_G
函数。由于只导入了访问器方法,因此C
或其任何用户都无法引发事件,这只能由外部DLL完成。
我怀疑它只是为了完整性。extern
关键字已经存在了,很可能拒绝它与事件的结合比使它工作更多的工作。
至于编辑器,属性、索引器、构造函数、静态构造函数、终结器、操作符都有一个共同点:它们都是方法。花哨的方法,但毕竟是方法。事件访问器也是如此。由于方法可以是extern
,所以这适用于所有方法,除非规则有特定的例外。特定的异常需要工作,并且工作的好处必须大于成本。在这种情况下,拒绝extern
几乎没有什么好处。