為何引入泛型
當我們要對不同型別的引數執行類似的方法時:如下所示功能列印傳入引數的相關資訊,
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}"); }
}
只是引數的不同,函式體以及函式名稱都相同,很快我們想到了一種替代方案:將函式形參改為Object,
public static void ShowParam(object oParam)//函式宣告oParam為object,但是實參為其子類-->LSP, { Console.WriteLine($"this is {typeof(CommonMethdod)},type={oParam.GetType().Name},param={oParam}"); }
這似乎能解決我們的問題,一個方法可以適用于所有型別,之所以能解決的原因是:
Object是所有類的基類; 任何父類出現的地方(Object作為函式簽名的形參),都可以用子類代替[實際傳入實參](里氏替換原則LSP),
但是其會存在這樣的問題:
- 性能問題:會出現裝箱與拆箱 ,此處為 int->object(裝箱),object->int實際型別(拆箱);
對于裝箱拆箱的問題,這里就要了解C#裝箱與拆箱的內部操作和C#記憶體模型,
詳情請移步至:
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxing
https://blog.csdn.net/qiaoquan3/article/details/51439726
2.型別安全問題(泛型約束可解決),如下所示:

程式編譯通過,但是運行期間會拋例外,對于這種以Object作為基類來進行裝箱拆箱的操作存在型別安全隱患,那在C#2.0泛型提出來后就很好的解決了這兩個問題,
關于泛型約束的問題,明天再寫,,,,
那泛型到底怎么使用呢?
泛型的使用:
如下所示為泛型方法的使用:
/// <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}"); }
我們在客戶端呼叫,代碼如下:
class Program { static void Main(string[] args) {
Console.WriteLine("***********************Common********************"); CommonMethdod.ShowParam(1); CommonMethdod.ShowParam("abc"); Console.WriteLine("***********************Object********************"); object obj = 3.1415926; CommonMethdod.ShowParam(obj); Console.WriteLine("***********************Generic********************"); string str = "efg"; int intVal = 0; CommonMethdod.ShowParam<string>(str); CommonMethdod.ShowParam<int>(intVal); Console.ReadKey(); } }
結果如下:

泛型的定義
泛型將型別引數的概念引入 .NET,這樣就可設計具有以下特征的類和方法:在客戶端代碼宣告并初始化這些類或方法之前,這些類或方法會延遲指定一個或多個型別,其兼具可重用性、型別安全性和效率,這是非泛型類和非泛型方法無法實作的,
總結:
- 使用泛型型別可以最大限度地重用代碼、保護型別安全性以及提高性能,
- 泛型最常見的用途是創建集合類,
- .NET 類別庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類, 應盡可能使用這些類來代替某些類,如 System.Collections 命名空間中的 ArrayList,
- 可以創建自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委托,
- 可以對泛型類進行約束以訪問特定資料型別的方法,
- 在泛型資料型別中所用型別的資訊可在運行時通過使用反射來獲取,
下章概括:
如何對泛型類以及泛型方法進行約束以范文特定資料型別,
如何創建自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委托,
如何通過反射獲取泛型資料型別進行相關操作,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/216008.html
標籤:.NET技术
上一篇:求求你不要在用!=null判空了
下一篇:求求你不要在用!=null判空了
