事件上的 extern 修饰符的目的是啥? [复制]

Posted

技术标签:

【中文标题】事件上的 extern 修饰符的目的是啥? [复制]【英文标题】:What is the purpose of the extern modifier on an event? [duplicate]事件上的 extern 修饰符的目的是什么? [复制] 【发布时间】:2014-08-14 13:48:10 【问题描述】:

在浏览C# Language Specification 5.0 时,我意识到您可以定义extern event。我习惯于为平台调用和本机回调外部方法。我在 .NET 领域工作了 11 年,还没有遇到过这个概念。

extern 事件与什么互操作? 它是否提供订阅某些原生事件的能力? 你能发起这样的活动吗? 它解决了哪些问题在 C# 语言中占有一席之地?

我在规范中搜索了“extern”,发现属性、索引器、构造器、静态构造器、终结器 (!) 甚至运算符 (!) 都可以是 extern。字段不能。 (我还了解到命名空间别名可以是“extern”,但它的含义完全不同。)

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

【问题讨论】:

这不是“伪”语法,它是由类型库导入工具 Tlbimp.exe 生成的代码。有时手工编写 [ComImport] 声明是可行的,只有在没有可用于组件的类型库时。 extern 修饰符可用于任何作为底层方法实现的声明,以及在发生事件时添加和删除访问器。 C# 编译器只是盲目地假设抖动将能够提供实现。 【参考方案1】:

我以前从未见过这个,搜索并没有真正找到任何实际用途,但可以在 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 几乎没有任何好处。

【讨论】:

以上是关于事件上的 extern 修饰符的目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]

访问修饰符 - 目的是啥?

Java 和 Scala 中 C# 的访问修饰符的等价物是啥?

“[*]”(星号修饰符)在 C 中是啥意思? [复制]

vue .sync修饰符的使用

匹配 Bootstrap -xs、-sm 等修饰符的媒体查询? [复制]