在浏览C# Language Specification 5.0时,我意识到您可以定义extern event
。我习惯于extern 方法进行平台调用和本机回调。我在.NET世界的11年里没有遇到过这个概念。
extern
事件与?我搜索了'extern'的规范,发现属性,索引器,构造函数,静态构造函数,终结符(!)甚至运算符(!)都可以是extern
。字段不能。 (我还了解到命名空间别名可以是'extern',但它意味着完全不同的东西。)
编辑:澄清事情。所以extern
不适用于事件概念或财产概念,而是适用于组成方法。那是对的吗? COM事件与DllImport
事件有什么不同吗?
答案 0 :(得分:4)
我以前从未见过这个,搜索并没有真正提出任何实际用途,但可以在Roslyn编译器测试套件中找到它:
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
public class C
{
[method: DllImport("c")]
public extern static event System.Action G;
}
测试验证这是从add_G
DLL导入remove_G
和c
函数。由于只导入了访问器方法,因此C
或其任何用户都无法引发事件,这只能由外部DLL完成。
我怀疑它只是为了完整性。 extern
关键字已经存在,与事件相结合拒绝它可能比使其工作更有效。
至于你的编辑,属性,索引器,构造函数,静态构造函数,终结器,运算符都有一个共同点:它们是方法。虽然花哨的方法,但方法。事件访问器也是如此。并且由于方法可以是extern
,因此除非规则具有特定的例外,否则它适用于所有方法。具体例外需要工作,这项工作的好处必须超过成本。在这种情况下,在这种情况下拒绝extern
几乎没有任何好处。