随笔 - 268  文章 - 0  评论 - 1028  阅读 - 160万

为什么不能把委托(delegate)放在一个接口(interface)当中?

stackoverflow上有人问,为什么不能把委托放在一个接口当中?

投票最多的第一个答案第一句话说,“A Delegate is just another type, so you don't gain anything by putting it inside the interface.”

翻译过来大致意思就是:委托只是一种类型,把委托放在接口中你什么也得不到。

看上去挺拗口的,如果你也感觉这句话说的不知所云,那么只能求助于MSDN的接口和委托的定义。

接口:只包含方法、属性、事件或索引器的签名。 实现接口的类或结构必须实现接口定义中指定的接口成员。

委托:是一种定义方法签名的类型。 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联。 您可以通过委托实例调用方法。

似乎还不能让人满意,我们看到接口中可以包含事件,再想一想事件和委托之间的关系,想一想常见的Delegate、EventHandler、 Predicate、Func、Action…

为什么接口中可以有事件而不能包含委托?

你现在有没有陷入混乱而无语的恐慌当中?

 

换个角度从接口和委托的IL代码来看本质,其实说清楚为什么不能把delegate放在一个interface当中非常简单。

先看一个简单的接口定义:

ISampleInterface

 IL反汇编代码如下:

interface

我们看到接口的定义中,方法、属性、索引器还有事件,本质上都是方法。其中索引器对应于get_Item,set_Item方法,属性对应get_Message,set_Message方法,而事件对应于add_MyHandler和remove_MyHandler方法。所以说属性、索引器还有事件只是语法糖而已。

我们再看下MSDN的委托示例:

public delegate int PerformCalculation(int x, int y);

它的反汇编代码如下:

delegate

根据IL,我们发现编译器自动将委托生成为一个继承自System.MulticastDelegate的类。

所以回头看委托的定义还是很有深刻意义的,委托只是一种定义方法签名的类型。而我们平时说自定义一个类型,通常就是自定义一个类,其实还应该包括自定义一个委托。

分析到这里,我们可以得出结论,接口内只能定义本质为方法的成员,不能定义类。

为什么不能把委托(delegate)放在一个接口(interface)当中?因为委托是一个类,而接口当中不能定义类

 

参考:

http://stackoverflow.com/questions/612957/why-cant-i-put-a-delegate-in-an-interface

posted on   JeffWong  阅读(3281)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2010-07-07 javascript:像操作Array一样操作NodeList
2009-07-07 aspx,ascx和ashx使用小结
2009-07-07 解决ajax调用中ie的缓存问题
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

I know how to make it works and I want to know how it works.
点击右上角即可分享
微信分享提示