C#8.0之後介面已經不再單純了,我懵逼了!
阿新 • • 發佈:2020-10-24
## 一:背景
### 1. 講故事
大家在經過面向物件洗禮的時候,都瞭解過介面,而且知道它是一種自上而下的設計思路,舉個例子,我們電腦上都有 USB 2.0 介面,藍芽耳機實現了它可以進行充電,行動硬碟實現了它可以在電腦端顯示硬碟內容,藍芽滑鼠實現了它可以進行滑鼠操控,可以看出USB插口做出來後,誰來實現誰也搞不清楚,實現者能做出什麼東西,誰也不知道,這就是介面的魅力,落實在 C# 上就是介面中那一個一個的 stub 方法,留給未來的有緣人去實現,如下程式碼:
``` C#
public interface IUsb
{
void Execute();
}
```
### 2. 你可能會有的疑惑
有些朋友可能會說,碼農胡言亂語,介面不光可以定義例項方法,還可以定義 屬性,索引器,事件 等等。。。 如下程式碼:
``` C#
public interface IUsb
{
event Action action;
string Name { get; set; }
string this[string key]
{
get; set;
}
void Execute();
}
```
哈哈,果然是一個好問題,沒錯,屬性,索引器和事件都可以定義在介面中,但請不要忘了,你列舉的這些都是編譯器層面的語法糖而已,言外之意就是你看過 編譯後的 IL 程式碼嗎? 如下圖所示:
![](https://img2020.cnblogs.com/other/214741/202010/214741-20201024090316279-1665494966.png)
可以看到,那些所謂的語法糖在IL層面統統是方法,這就很好的解釋了為啥介面中只能定義方法的原因。
### 3. 現在的介面真的變了
然而這種平衡在 C# 8.0 中被打破,現如今的介面除了常規的例項方法,還可以定義任何標記為 static 的欄位,屬性,方法,建構函式 甚至還可以是 例項方法的預設實現,這就很奇葩了。。。不得不大吼一聲,