extern修饰符对事件的目的是什么?

时间:2014-08-14 13:48:10

标签: c# .net

在浏览C# Language Specification 5.0时,我意识到您可以定义extern event。我习惯于extern 方法进行平台调用和本机回调。我在.NET世界的11年里没有遇到过这个概念。

  • extern事件与?
  • 的互操作性
  • 它是否提供订阅某些原生事件的能力?
  • 你能举起这样的活动吗?
  • 它在C#语言中取得了哪些问题?

我搜索了'extern'的规范,发现属性,索引器,构造函数,静态构造函数,终结符(!)甚至运算符(!)都可以是extern。字段不能。 (我还了解到命名空间别名可以是'extern',但它意味着完全不同的东西。)

编辑:澄清事情。所以extern不适用于事件概念或财产概念,而是适用于组成方法。那是对的吗? COM事件与DllImport事件有什么不同吗?

1 个答案:

答案 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_Gc函数。由于只导入了访问器方法,因此C或其任何用户都无法引发事件,这只能由外部DLL完成。

我怀疑它只是为了完整性。 extern关键字已经存在,与事件相结合拒绝它可能比使其工作更有效。

至于你的编辑,属性,索引器,构造函数,静态构造函数,终结器,运算符都有一个共同点:它们是方法。虽然花哨的方法,但方法。事件访问器也是如此。并且由于方法可以是extern,因此除非规则具有特定的例外,否则它适用于所有方法。具体例外需要工作,这项工作的好处必须超过成本。在这种情况下,在这种情况下拒绝extern几乎没有任何好处。