事件上的 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_G
和remove_G
函数。由于只导入访问器方法,C
或其任何用户都无法引发事件,这只能由外部 DLL 完成。
我怀疑它只是为了完整性。 extern
关键字已经存在,与事件结合起来拒绝它可能比让它发挥作用更费力。
至于您的编辑,属性、索引器、构造器、静态构造器、终结器、操作符都有一个共同点:它们都是方法。花哨的方法,但仍然是方法。事件访问器也是如此。并且由于方法可以是extern
,这适用于所有方法,除非规则有特定的例外。特定的例外情况需要工作,而这项工作的收益必须超过成本。在这种情况下,拒绝extern
几乎没有任何好处。
【讨论】:
以上是关于事件上的 extern 修饰符的目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Java 反射 API 允许我们访问私有和受保护的字段和方法?这不会破坏访问修饰符的目的吗? [复制]