C#隱式/顯示完成接口辦法詳解。本站提示廣大學習愛好者:(C#隱式/顯示完成接口辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#隱式/顯示完成接口辦法詳解正文
接口界說了一系列的行動標准,為類型界說一種Can-Do的功效。例如,完成IEnumerable接口界說了GetEnumerator辦法,用於獲得一個列舉數,該列舉數支撐在聚集長進行迭代,也就是我們常說的foreach。接口只是界說行動,詳細的完成須要由詳細類型擔任,完成接口的辦法又分為隱式完成與顯示完成。
1、隱式/顯示完成接口辦法
簡略的說,我們日常平凡“默許”應用的都是隱式的完成方法。例如:
interface ILog { void Log(); } public class FileLogger : ILog { public void Log() { Console.WriteLine("記載到文件!"); } }
隱式完成很簡略,平日我們商定接口定名以 I 開首,便利浏覽。接口內的辦法不須要用public,編譯器會主動加上。類型中完成接口的辦法只能是public,也能夠界說成虛辦法,由子類重寫。如今看顯示完成的方法:
public class EventLogger : ILog { void ILog.Log() { Console.WriteLine("記載到體系事宜!"); } }
與下面分歧的是,辦法用了ILog指明,並且沒有(也不克不及有)public或許private潤飾符。
除語法上的分歧,挪用方法也分歧,顯示完成只能用接口類型的變量來挪用,如:
FileLogger fileLogger = new FileLogger(); fileLogger.Log(); //准確 EventLogger eventLogger = new EventLogger(); eventLogger.Log(); //報錯 ILog log = new EventLogger(); log.Log(); //准確
2、什麼時候應用
1. c#許可完成多個接口,假如多個接口界說了雷同的辦法,可以用顯示完成的方法加以辨別,例如:
interface ISendable { void Log(); } public class EmailLogger : ILog, ISendable { void ILog.Log() { Console.WriteLine("ILog"); } void ISendable.Log() { Console.WriteLine("ISendable"); } }
2. 加強編譯時的類型平安和防止值類型裝箱
有了泛型,我們天然可以做到編譯時的類型平安和防止值類型裝箱的操作。但有時刻能夠沒有對應的泛型版本。例如:IComparable(這裡只是舉例,現實有IComparable<T>)。如:
interface IComparable { int CompareTo(object obj); } struct ValueType : IComparable { private int x; public ValueType(int x) { this.x = x; } public int CompareTo(object obj) { return this.x - ((ValueType)obj).x; } }
挪用:
ValueType vt1 = new ValueType(1); ValueType vt2 = new ValueType(2); Console.WriteLine(vt1.CompareTo(vt2));
因為形參是object,下面的CompareTo會產生裝箱;並且沒法取得編譯時的類型平安,例如我們可以隨意傳一個string,編譯不會報錯,比及運轉時才拋出InvalidCastException。應用顯示完成接口的方法,如:
public int CompareTo(ValueType vt) { return this.x - vt.x; } int IComparable.CompareTo(object obj) { return CompareTo((ValueType)obj); }
再次履行下面的代碼,就不會產生裝箱操作,並且可以取得編譯時的類型平安了。然則假如我們用接口變量挪用,就會再次產生裝箱並損失編譯時的類型平安檢測才能。
IComparable vt1 = new ValueType(1); //裝箱 ValueType vt2 = new ValueType(2); Console.WriteLine(vt1.CompareTo(vt2)); //再次裝箱
3、缺陷
1. 顯示完成只能用接口類型變量挪用,會給人的感到是某類型完成了該接口卻沒法挪用接口中的辦法。特殊是寫成類庫給他人挪用時,顯示完成的接口辦法在vs中按f12都不會顯示出來。(這點有人在csdn發問過,為何某個類型可以不消完成接口辦法)
2. 關於值類型,要挪用顯示完成的辦法,會產生裝箱操作。
3. 沒法被子類繼續應用。
以上就是C#顯示完成接口的全體內容,願望對年夜家的進修有所贊助。