1. 程式人生 > >C#8.0之後介面已經不再單純了,我懵逼了!

C#8.0之後介面已經不再單純了,我懵逼了!

## 一:背景 ### 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 的欄位,屬性,方法,建構函式 甚至還可以是 例項方法的預設實現,這就很奇葩了。。。不得不大吼一聲,