為何引入泛型當(dāng)我們要對不同類型的參數(shù)執(zhí)行類似的方法時:如下所示功能打印傳入?yún)?shù)的相關(guān)信息。 class CommonMethdod { /// <summary> /// show int /// </summary> public static void ShowParam(int iParam) { Console.WriteLine($"this is {typeof(CommonMethdod)},type={iParam.GetType().Name},param={iParam}"); } public static void ShowParam(string sParam) { Console.WriteLine($"this is {typeof(CommonMethdod)},type={sParam.GetType().Name},param={sParam}"); } 只是參數(shù)的不同,函數(shù)體以及函數(shù)名稱都相同,很快我們想到了一種替代方案:將函數(shù)形參改為Object。 public static void ShowParam(object oParam)//函數(shù)聲明oParam為object,但是實參為其子類-->LSP。 { Console.WriteLine($"this is {typeof(CommonMethdod)},type={oParam.GetType().Name},param={oParam}"); } 這似乎能解決我們的問題,一個方法可以適用于所有類型。之所以能解決的原因是: Object是所有類的基類; 任何父類出現(xiàn)的地方(Object作為函數(shù)簽名的形參),都可以用子類代替[實際傳入實參](里氏替換原則LSP)。
對于裝箱拆箱的問題,這里就要了解C#裝箱與拆箱的內(nèi)部操作和C#內(nèi)存模型。 詳情請移步至: https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxing https://blog.csdn.net/qiaoquan3/article/details/51439726 2.類型安全問題(泛型約束可解決)。如下所示: 程序編譯通過,但是運行期間會拋異常,對于這種以O(shè)bject作為基類來進(jìn)行裝箱拆箱的操作存在類型安全隱患。那在C#2.0泛型提出來后就很好的解決了這兩個問題。 關(guān)于泛型約束的問題,明天再寫。。。。 那泛型到底怎么使用呢? 泛型的使用:如下所示為泛型方法的使用: /// <summary> /// 泛型方法代替上一個Object方法 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParam"></param> public static void ShowParam<T>(T tParam) { Console.WriteLine($"this is {typeof(T)},type={tParam.GetType().Name},param={tParam}"); } 我們在客戶端調(diào)用,代碼如下: class Program { static void Main(string[] args) { 結(jié)果如下: 泛型的定義泛型將類型參數(shù)的概念引入 .NET,這樣就可設(shè)計具有以下特征的類和方法:在客戶端代碼聲明并初始化這些類或方法之前,這些類或方法會延遲指定一個或多個類型。其兼具可重用性、類型安全性和效率,這是非泛型類和非泛型方法無法實現(xiàn)的。 總結(jié):
下章概括: 如何對泛型類以及泛型方法進(jìn)行約束以范文特定數(shù)據(jù)類型。 如何創(chuàng)建自己的泛型接口、泛型類、泛型方法、泛型事件和泛型委托。 如何通過反射獲取泛型數(shù)據(jù)類型進(jìn)行相關(guān)操作。 |
|