天天看點

C#基礎系列——小話泛型

1、什麼是泛型:通過參數化類型來實作在同一份代碼上操作多種資料類型。利用“參數化類型”将類型抽象化,進而實作靈活的複用。怎麼了解呢,其實根據部落客的了解,泛型就是将類型抽象化,使用抽象化的類型或對象去實作某些功能和業務,然後所有需要使用這些功能和業務的具體類型去調用泛型的方法和委托。呵呵,是不是還是有點暈,别着急,我們來個例子:

我們首先來定義一種場景:我們通過sql語句使用Ado.Net來查詢預設得到的是弱類型的DataTable、DataReader等,而我們需要對查詢到的結果集使用lamada表達式進行某些複雜的計算,需要将DataTable轉換為對應的List<T>集合,首先來定義一個泛型的方法:

C#基礎系列——小話泛型
C#基礎系列——小話泛型

有了這個泛型的方法,我們在轉換DataTable和具體的List<Model>的時候是不是就是一個很好的複用。

2、為什麼要使用泛型:部落客記得剛參加工作的前兩年有一次面試的時候就被問到“泛型有什麼優勢?”,當時怎麼回答的不記得了,隻知道面試不太順利~~為什麼要用泛型呢?部落客覺得泛型的主要優勢有以下幾點:

(1)保證了類型的安全性:泛型限制了變量的類型,保證了類型的安全性。例如List<int>和ArrayList。List<int>集合隻能加入int類型的變量,ArrayList可以Add任何常用類型,編譯的時候不會提示錯誤。

(2)避免了不必要的裝箱、拆箱操作,提高程式的性能:泛型變量固定了類型,使用的時候就已經知道是值類型還是引用類型,避免了不必要的裝箱、拆箱操作。舉例說明:

使用泛型之前,我們使用object代替。

使用泛型之後

C#基礎系列——小話泛型
C#基礎系列——小話泛型

(3)提高方法、算法的重用性。上面的例子基本能說明這個優勢。

3、泛型的使用:

(1)泛型方法的使用:這也是部落客使用最多的用法之一,像這種泛型方法一般是一些static的通用方法,例如原來項目中用到的一個将DataGridViewRow對象轉換成對應的實體Model的方法如下:

C#基礎系列——小話泛型
C#基礎系列——小話泛型

使用泛型方法的注意事項:

泛型方法的重載:public void Fun1<T>(T a);和public void Fun1<U>(U a);是無法重載的,這其實很好了解,因為T和U其實都是泛型的一個代表符号而已;

泛型方法的重寫:下面的方法重寫FuncA的重寫是正确的,FuncB的重寫不正确,因為限制被預設繼承,不用再寫。

C#基礎系列——小話泛型
C#基礎系列——小話泛型

(2)泛型類的使用:

使用這個類的時候必須要指定兩個泛型類。

(3)泛型接口以及泛型繼承的使用:

泛型接口的類型參數要麼已執行個體化,要麼來源于實作類聲明的類型參數

DTO來源于實作類Class_Base

(4)泛型委托的使用:其實這種用法部落客真的用得很少,隻是原來見到過大牛們類似的代碼。

定義泛型委托:

泛型委托的使用:

C#基礎系列——小話泛型
C#基礎系列——小話泛型

(5)泛型限制:用來限制泛型類型有那些特性。常見的泛型限制也就那麼幾類:

泛型限制的格式

限制

說明

T:struct

類型參數必須是值類型。可以指定除 Nullable 以外的任何值類型。

T:class

類型參數必須是引用類型,包括任何類、接口、委托或數組類型。

T:new()

類型參數必須具有無參數的公共構造函數。當與其他限制一起使用時,new() 限制必須最後指定。

T:<基類名>

類型參數必須是指定的基類或派生自指定的基類。

T:<接口名稱>

類型參數必須是指定的接口或實作指定的接口。可以指定多個接口限制。限制接口也可以是泛型的。

T:U

為 T 提供的類型參數必須是為 U 提供的參數或派生自為 U 提供的參數。這稱為裸類型限制.

本文轉自懶得安分部落格園部落格,原文連結:http://www.cnblogs.com/landeanfen/p/4642820.html,如需轉載請自行聯系原作者