1. 程式人生 > 其它 >C#高階程式設計之泛型一(泛型的引入、泛型的使用、何為泛型)

C#高階程式設計之泛型一(泛型的引入、泛型的使用、何為泛型)

技術標籤:C#教程c#教程

為何引入泛型
當我們要對不同型別的引數執行類似的方法時:如下所示功能列印傳入引數的相關資訊。

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作為函式簽名的形參),都可以用子類代替實際傳入實參
但是其會存在這樣的問題:

效能問題:會出現裝箱與拆箱 。此處為 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(str);
CommonMethdod.ShowParam(intVal);
Console.ReadKey();
}
}

結果如下:

在這裡插入圖片描述

泛型的定義
泛型將型別引數的概念引入 .NET,這樣就可設計具有以下特徵的類和方法:在客戶端程式碼宣告並初始化這些類或方法之前,這些類或方法會延遲指定一個或多個型別。其兼具可重用性、型別安全性和效率,這是非泛型類和非泛型方法無法實現的。

總結:
使用泛型型別可以最大限度地重用程式碼、保護型別安全性以及提高效能。
泛型最常見的用途是建立集合類。
.NET 類庫在 System.Collections.Generic 名稱空間中包含幾個新的泛型集合類。 應儘可能使用這些類來代替某些類,如 System.Collections 名稱空間中的 ArrayList。
可以建立自己的泛型介面、泛型類、泛型方c#教程法、泛型事件和泛型委託。
可以對泛型類進行約束以訪問特定資料型別的方法。
在泛型資料型別中所用型別的資訊可在執行時通過使用反射來獲取。
下章概括:

如何對泛型類以及泛型方法進行約束以範文特定資料型別。

如何建立自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委託。

如何通過反射獲取泛型資料型別進行相關操作。