C# 泛型的使用
01
—
泛型概述
? ? ? ?泛型是用于處理算法、數據結構的一種編程方法。泛型的目標是采用廣泛適用和可交互性的形式來表示算法和數據結構,以使它們能夠直接用于軟件構造。泛型類、結構、接口、委托和方法可以根據它們存儲和操作的數據的類型來進行參數化。泛型能在編譯時提供強大的類型檢查,減少數據類型之間的顯式轉換、裝箱操作和運行時的類型檢查。泛型類和泛型方法同時具備可重用性、類型安全和效率高等特性,這是非泛型類和非泛型方法無法具備的。泛型通常用在集合和在集合上運行的方法中。
? ? ? ?泛型主要是提高了代碼的重用性,例如,可以將泛型看成是一個可以回收的包裝箱 A。如果在包裝箱 A 上貼上蘋果標簽,就可以在包裝箱A 里裝上蘋果進行發送;如果在包裝箱 A 上貼上地瓜標簽就可以在包裝箱 A 里裝上地瓜進行發送。
02
—
泛型的使用
? ? ? ?在下面內容中將會詳細介紹泛型的類型參數 T,以及如何創建泛型接口和泛型方法,并且通過實例演示泛型接口和泛型方法在程序中的應用。
1. 類型參數T
泛型的類型參數 T 可以看作是一個占位符,它不是一種類型,它僅代表了某種可能的類型。類型參數T可以在使用時用任何類型來代替。類型參數T的命名準則如下。
? ? ????使用描述性名稱命名泛型類型參數,除非單個字母名稱完全可以讓人了解它表示的含義,而描述性名稱不會有更多的意義。
? ? ?【例1】 使用代表一定意義的單詞作為類型參數T的名稱。
? ? ? 代碼如下:
? ?public interface ISessionChannel<Session>
? ?public delegate TOutput Converter<input, Output>
? ?????將T作為描述性類型參數名的前綴。
? ? 【例2】 使用T作為類型參數名的前綴。
? ? ? 代碼如下:
public?interface?ISessionChannel<TSession>{ TSession?Session{ get;}}2.? 泛型接口
泛型接口的聲明形式如下:?
interface?【接口名】<T>
{
? ? ? ? ? 【接口體】
}
? ? ? ?聲明泛型接口時,與聲明一般接口的唯一區別是增加了一個<T>。一般來說,聲明泛型接口與聲明非泛型接口遵循相同的規則。泛型類型聲明所實現的接口必須對所有可能的構造類型都保持唯一,否則就無法確定該為某些構造類型調用哪個方法。
? ? ? ?說明?
? ? ? ? ? ? ??在實例化泛型時也可以使用約束對類型參數的類型種類施加限制,約束是使用 where 上下文關鍵字指定的,下面列出了 6種類型的約束。
? ? ? ① T:結構——類型參數必須是值類型。可以指定除 Nullable 以外的任何值類型。
? ? ? ② T:類——類型參數必須是引用類型。這一點也適用于任何類、接口、委托或數組類型。
? ? ? ③ T:new()——類型參數必須具有無參數的公共構造函數,當與其他約束一起使用時,new()約束必須最后指定。
? ? ? ④ T:<基類名>——類型參數必須是指定的基類或派生自指定的基類。
? ? ? ⑤ T:<接口名稱>——類型參數必須是指定的接口或實現指定的接口。可以指定多個接口約束,約束接口也可以是泛型的。
? ? ? ⑥ T:U——為T提供的類型參數必須是為 U提供的參數或派生自為 U提供的參數,這稱為裸類型約束。
? ? ?【例3】 創建一個控制臺應用程序,首先創建一個 Factory 類,在該類中建立一個CreateInstance方法。然后再創建一個泛型接口,在這個泛型接口中調用 Createlnstance 方法。根據類型參數 T,獲取其類型。
? ? ? 代碼如下:
//創建一個泛型接口public?interface?IGenericInterface<T>{?????T?CreateInstance();????//接口中調用?CreateInstance?方法?}//實現上面泛型接口的泛型類//派生約束?where?T:?TI(T?要繼承自?TI)//構造函數約束?where?T:new()(T?可以實例化)public?class?Factory<T,TI>;IGenericInterface<TI>?where?T:?TI,new(){?????public?TI?CreateInstance()????//創建一個公共方法?CreateInstance{??????????return?new?T();????} } class?Program {????static?void?Main(string[]?args)????{//實例化接口?????????IGenericInterface<System.ComponentModel.IListSource>?factory?=new?Factory<System.Data.DataTable,System.ComponentModel.IListSource>();???//輸出指定泛型的類型?????????Console.WriteLine(factory.CreateInstance().GetType().ToString());??Console.ReadLine();????} }程序的運行結果如圖1 所示。
圖1? 泛型接口應用
3.? 泛型方法
泛型方法的聲明形式如下:
【修飾符】 Void 【方法名】<類型參數T>
{
??? 【方法體】
}
泛型方法是在聲明中包括了類型參數T的方法。泛型方法可以在類、結構或接口聲明中聲明,這些類、結構或接口本身可以是泛型或非泛型。如果在泛型類型聲明中聲明泛型方法,則方法體可以同時引用該方法的類型參數T和包含該方法的聲明的類型參數 T。
說明
? ? ? ?泛型方法可以使用多類型參數進行重載。
? ? ?【例4】 創建一個控制臺應用程序,通過定義一個泛型方法來查找數組中某個數字的位置。
? ? ? 代碼如下:
public?class?Finder?????//建立一個公共類?Finder{public?static?int?Find<T>(T[]?items,T?item)?????//創建泛型方法?{for(int?i=?0;i <?items.Length;i++)? //調用?for?循環?{if(items[i].Equals(item)) //調用 Equals 方法比較兩個數 {return?i; //返回相等數在數組中的位置}}return?-1; ?//如果不存在指定的數,則返回-1?} } class Program {static?void?Main(string[]?args){int?i=?Finder.Find<int>(new?int[](1,2,3,4,5,6,8,9),6);????//調用泛型方法,并定義數組指定數字?Console.WriteLine("6?在數組中的位置:"+i.ToString()); ?//輸出中數字在數組中的位置?Console.ReadLine();} }程序的運行結果是“6 在數組中的位置為5”。
總結
- 上一篇: Envoy实现.NET架构的网关(一)静
- 下一篇: c# char unsigned_dll