extern修饰符在事件上有什么作用?

12

在浏览C#语言规范5.0时,我发现你可以定义一个extern event。我习惯了用于平台调用和本地回调的外部方法,但在我的11年.NET世界中没有遇到过这个概念。

  • extern事件与什么进行互操作?
  • 它是否提供订阅某些本机事件的能力?
  • 你能触发这样的事件吗?
  • 它解决了哪些问题,从而使其在C#语言中占据了一席之地?

我搜索了“extern”规范并发现属性、索引器、构造函数、静态构造函数、终结器(!)甚至操作符(!)都可以是extern。字段不行。(我还了解到,命名空间别名可以是“extern”,但意思完全不同。)

编辑:这澄清了事情。因此,extern不适用于事件概念或属性概念,而适用于组成方法。这正确吗? COM事件与DllImport事件有何不同?


这不是“伪”语法,而是由类型库导入工具Tlbimp.exe生成的代码。只有在没有组件类型库可用时,才会手动编写[ComImport]声明。extern修饰符可以用于任何在幕后实现为方法的声明,事件的添加和删除访问器也是如此。C#编译器只是盲目地假设Jitter将能够提供实现。 - Hans Passant
1个回答

4

我从未见过这种情况,并且搜索也没有真实世界的用例,但可以在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几乎没有任何好处。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接