當咱們要對不一樣類型的參數執行相似的方法時:以下所示功能打印傳入參數的相關信息。api
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}"); }
這彷佛能解決咱們的問題,一個方法能夠適用於全部類型。之因此能解決的緣由是:ide
Object是全部類的基類; 任何父類出現的地方(Object做爲函數簽名的形參),均可以用子類代替[實際傳入實參](里氏替換原則LSP)。
可是其會存在這樣的問題:函數
對於裝箱拆箱的問題,這裏就要了解C#裝箱與拆箱的內部操做和C#內存模型。性能
詳情請移步至:ui
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/types/boxing-and-unboxingthis
https://blog.csdn.net/qiaoquan3/article/details/51439726spa
2.類型安全問題(泛型約束可解決)。以下所示:.net
程序編譯經過,可是運行期間會拋異常,對於這種以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,這樣就可設計具備如下特徵的類和方法:在客戶端代碼聲明並初始化這些類或方法以前,這些類或方法會延遲指定一個或多個類型。其兼具可重用性、類型安全性和效率,這是非泛型類和非泛型方法沒法實現的。
下章歸納:
如何對泛型類以及泛型方法進行約束以範文特定數據類型。
如何建立本身的泛型接口、泛型類、泛型方法、泛型事件和泛型委託。
如何經過反射獲取泛型數據類型進行相關操做。