C# 8.0 之后接口已经不再单纯了,我懵逼了!

Posted DotNet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 8.0 之后接口已经不再单纯了,我懵逼了!相关的知识,希望对你有一定的参考价值。

(给DotNet加星标,提升.Net技能

转自:一线码农
cnblogs.com/huangxincheng/p/13867475.html

一、背景


1、讲故事


大家在经过面向对象洗礼的时候,都了解过接口,而且知道它是一种自上而下的设计思路,举个例子,我们电脑上都有 USB 2.0 接口,蓝牙耳机实现了它可以进行充电,移动硬盘实现了它可以在电脑端显示硬盘内容,蓝牙鼠标实现了它可以进行鼠标操控,可以看出USB插口做出来后,谁来实现谁也搞不清楚,实现者能做出什么东西,谁也不知道,这就是接口的魅力,落实在 C# 上就是接口中那一个一个的 stub 方法,留给未来的有缘人去实现,如下代码:


public interface IUsb
{
void Execute();
}


2、你可能会有的疑惑


有些朋友可能会说,码农胡言乱语,接口不光可以定义实例方法,还可以定义 属性,索引器,事件 等等。。。如下代码:


public interface IUsb
{
event Action<string> action;
string Name { get; set; }
string this[string key]
{
get; set;
}
void Execute();
}


哈哈,果然是一个好问题,没错,属性,索引器和事件都可以定义在接口中,但请不要忘了,你列举的这些都是编译器层面的语法糖而已,言外之意就是你看过 编译后的 IL 代码吗?如下图所示:



可以看到,那些所谓的语法糖在IL层面统统是方法,这就很好的解释了为啥接口中只能定义方法的原因。


3、现在的接口真的变了


然而这种平衡在 C# 8.0 中被打破,现如今的接口除了常规的实例方法,还可以定义任何标记为 static 的字段,属性,方法,构造函数 甚至还可以是 实例方法的默认实现,这就很奇葩了。不得不大吼一声,

以上是关于C# 8.0 之后接口已经不再单纯了,我懵逼了!的主要内容,如果未能解决你的问题,请参考以下文章

字节一面,面试官拿 System.out.println() 考了我半个小时?我懵逼了...

字节一面,面试官拿 System.out.println() 考了我半个小时?我懵逼了...

字节一面,面试官拿 System.out.println() 考了我半个小时?我懵逼了...

美团一面:JDK 1.8 中的 HashMap 如何应对 hash 冲突?我懵逼了。。

面试官:为什么数据库连接池不采用 IO 多路复用?我懵逼了。。

面试官:为什么数据库连接池不采用 IO 多路复用?我懵逼了。。