事件外部修饰符的目的是什么?

本文关键字:是什么 外部 事件 | 更新日期: 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_Gremove_G函数。由于只导入了访问器方法,因此C或其任何用户都无法引发事件,这只能由外部DLL完成。

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

至于编辑器,属性、索引器、构造函数、静态构造函数、终结器、操作符都有一个共同点:它们都是方法。花哨的方法,但毕竟是方法。事件访问器也是如此。由于方法可以是extern,所以这适用于所有方法,除非规则有特定的例外。特定的异常需要工作,并且工作的好处必须大于成本。在这种情况下,拒绝extern几乎没有什么好处。