前言
泛型是C#和.Net的一個重要概念,泛型不僅是C#編程語言中的一部分,而且與程序集中的IL(Intermediate Language)代碼緊密的集成。
在平時編程過程中,常常會出現(xiàn)編寫一些差不多的代碼塊,不同的僅是處理不同的數(shù)據(jù)類型。比如一個處理int數(shù)據(jù)的方法,現(xiàn)在新加了string類型的數(shù)據(jù)。是不是把之前的方法復(fù)制一遍,然后修改類型int為string。當然這樣的方法是沒有錯的,那么后面又新增了其他的許多類型怎么辦?還是復(fù)制修改嗎?這樣代碼看上去很冗余,很復(fù)雜。這時候泛型就出現(xiàn)了。下面我們看下為何使用泛型吧。
優(yōu)點
下面介紹下泛型的優(yōu)點,尤其是下面幾個:
*
* l?性能
* l?類型安全
* l?二進制代碼重用
?
一、性能
泛型的一個主要優(yōu)點就是性能,在泛型集合類和非泛型集合類中,對值類型使用非泛型集合類,在把值類型轉(zhuǎn)換為引用類型和把引用類型轉(zhuǎn)換為值類型的時候,需要進行裝箱和拆箱的操作(前面的文章中講到了拆箱和裝箱會造成一定的性能損失),當集合數(shù)據(jù)量大的時候造成的性能損失也就隨之的增大了。
使用非泛型集合時:
var list = new ArrayList(); list.Add(100);//裝箱 int-object int i = (int)list[0];
//拆箱 object-int foreach (int item in list) { Console.WriteLine(item);//遍歷拆箱輸出 }
?
使用泛型集合類時:
?
var list = new List<int>(); list.Add(100);//無裝箱操作 int i = list[0];//無拆箱拆箱
foreach (int item in list) { Console.WriteLine(item);//無拆箱操作 }
?
減少裝箱拆箱操作,節(jié)省了性能消耗。這也就是泛型的主要優(yōu)點了。
二、類型安全
泛型另一個優(yōu)點就是類型安全,這里我們還是使用非泛型集合類ArrayList()和泛型集合類List<T>來做案例。
非泛型集合類ArrayList():
? ??
var list = new ArrayList(); list.Add(100);// 添加一個int類型 list.Add("string");//
添加一個string類型 foreach (int item in list) { Console.WriteLine(item);//遍歷循環(huán)輸出 }
這里允許輸出和拋出異常: System.InvalidCastException:“Unable to castobject of type '
System.String' to type 'System.Int32'.”
無法強制把”string”轉(zhuǎn)換成int類型。
我們再看泛型集合類:
var list = new List<int>(); list.Add(100);// 添加一個int類型 list.Add("string"
);//添加一個string類型,編譯器報錯,無法從string轉(zhuǎn)換到int foreach (int item in list) {
Console.WriteLine(item);//遍歷循環(huán)輸出 }
在添加”string”類型的時候編譯器報錯,無法添加。這里也就杜絕了后續(xù)的錯誤。這也就是保證了類型的安全。
?
三、二進制代碼重用
泛型允許更好的重用二進制代碼,泛型類型可以定義一次,并且可以再許多不同的類型實例化,相比C++來說,不用每次訪問源代碼。
例如上面使用的泛型集合類,using System.Collections.Generic;
中的List<T>類,可以用int,string,自定義類去實例化。
泛型類型還可以在一種語言定義,然后再其他任何.Net語言中使用。
?
泛型類的功能
這里我們可以來了解下創(chuàng)建泛型類了之后,泛型類有哪些功能呢?
*
* l?默認值
* l?約束
* l?繼承
* l?靜態(tài)成員
一、默認值
在我們定義了泛型類型之后如何賦值呢?
public class Tclass<T> { public static T Get() { T a = default; return a; } }
因為在泛型中初始給值不好給,你說給null吧,null是給引用類型的,你是給0吧,這又是給值類型的,這時候出現(xiàn)了default,當時引用類型調(diào)用時就給null,當時值類型時就0。
?
二、約束
說到泛型類型的約束時,不得不提關(guān)鍵字where,where是用來限制參數(shù)的范圍的,如果不符合where條件指定的參數(shù)范圍,編譯是不允許通過的。
這里泛型類型的約束主要可以分為以下6中
*
* l?Where T: class(類型參數(shù)必須是引用類型)
* l?Where T:struct(類型參數(shù)必須是值類型) public class Tclass<T,U> where T:class //
類型參數(shù)為引用類型 where U:struct //類型參數(shù)為值類型 {}
?
*
* l?Where T:<接口名稱>(類型參數(shù)必須是指定的接口或者實現(xiàn)指定的接口) /// <summary> /// 接口 /// </summary>
interface Itest { } /// <summary> /// 定義一個字典類型 /// </summary> /// <typeparam
name="TK"></typeparam> /// <typeparam name="TV"></typeparam> class
Dictionary<TK, TV>where TK : IComparable, IEnumerable where TV : Itest { public
void Add(TK key, TV val) { } }
?
?
*
* l?Where T:<基類名>(參數(shù)必須是指定的基類或者是派生自指定的基類) class Ttest { } class Tclass<T> where
T:Ttest { }
?
*
* l?Where T:new ()(這是一個構(gòu)造函數(shù)的約束,指定參數(shù)類型必須有一個默認構(gòu)造函數(shù),當與其他約束一起使用時必須放在其最后) class
EmployeeList<T>where T : Employee, IEmployee, System.IComparable<T>, new() {
// ... }
?
*
* l?Where T1:T2(這個約束指定類型T1派生自泛型類型T2,也就是說T1的參數(shù)類型要和T2一樣) public class
Tclass<T>where T:IComparable { }
?
?
三、繼承
泛型類型的繼承與普通類的繼承相似但不同。
/// <summary> /// 抽象基類,泛型類型 /// </summary> /// <typeparam name="T"></typeparam>
public abstract class Ttest<T> { public abstract T Add(T x, T y); } ///
<summary> /// 繼承抽象基類,實現(xiàn)int類型 /// </summary> /// <typeparam name="T"></typeparam>
class Tclass<T> : Ttest<int> { public override int Add(int x, int y) => x + y; }
?
四、靜態(tài)成員
泛型類型的靜態(tài)成員需要特殊的關(guān)注,泛型類的靜態(tài)成員只能在類的一個實例中共享。
/// <summary> /// 泛型類型,靜態(tài)字段x /// </summary> /// <typeparam
name="T"></typeparam> public class Ttest<T> { public static int x; } class
Program {static void Main(string[] args) { Ttest<string>.x = 111; Ttest<int>.x =
222; Console.WriteLine(Ttest<string>.x); } }
上面事例中最后輸出的為111,
總結(jié)
這里我們主要是介紹了泛型的優(yōu)點及泛型類型的功能。在我們?nèi)粘5木幊讨袝l(fā)現(xiàn)很多地方可以使用泛型。提高代碼的擴展性及重用性。同時也可以減少對object類型的使用,采用泛型類型的使用來替代。較少對性能的消耗。我們下一節(jié)主要是對泛型類型的協(xié)變及抗變進行一定的理解。
?
只要認為是對的就去做,堅持去做,不要在乎別人的看法,哪怕是錯,至少你有去做過證明曾經(jīng)你努力過。
?
?
?
c#基礎(chǔ)知識詳解系列
<https://www.cnblogs.com/hulizhong/p/11205119.html>
?
?
?
歡迎大家掃描下方二維碼,和我一起學(xué)習(xí)更多的C#知識
?
?
?
?
?
熱門工具 換一換
感谢您访问我们的网站,您可能还对以下资源感兴趣:
调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看