歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 淺析C#中的泛型

淺析C#中的泛型

日期:2017/3/1 9:35:02   编辑:Linux編程

接觸C#泛型很長時間了,但總沒有時間對起做個總結,不得不說泛型是個好東西,能大大的減少我們的代碼量,下面來說一下有關泛型的相關知識。

1.什麼是泛型?

在介紹泛型之前,先看一個小的事例。

/// <summary>
/// 計算兩個整形相加
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public int Add(int a, int b)
{
return a + b;
}


/// <summary>
/// 計算兩個浮點型相加
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public decimal Add(decimal a, decimal b)
{
return a + b;
}

上述是兩個非常簡單的方法,實現了兩個數的相加操作。但是如果細心的話,也會發現兩個方法有相同的地方,我們可以寫成一下的格式 public T Add(T a,T b),至於T是什麼東東,不管他,反正就是一個占位符,就好比上述的Int 或者Decimal,所以如果有這樣一個占位符,能夠代替所有的類型不就好了嗎?因此.net專門提供了專門的語法來替代占位符,其中一種就是在定義類型的時候傳遞,此時,類型也就變成了泛型類。

小結:泛型允許我們聲明類型參數化的代碼,我們可以用不同的類型進行實例化。也就是說,我們可以用"類型占位符"來寫代碼,然後在創建類的實例時提供真實的類型。

2.泛型類

聲明一個泛型類也特別的簡單,跟平常的類書寫大致相似,只不過把需要改變的地方用類型占位符替換即可。

/// <summary>
/// 泛型類
/// </summary>
/// <typeparam name="T1">泛型參數</typeparam>
/// <typeparam name="T2">泛型參數</typeparam>
class SomeClass<T1,T2> where T1 :new() where T2:new()
{
//根據泛型參數,創建一個類
public T1 SomeVar = new T1();
public T2 OtherVar = new T2();

}

看了上述代碼是否感覺特別的清爽,就是這麼簡單,與普通類的區別就是在類名之後放置了一組尖括號,並且在尖括號中用逗號分隔占位符來表示希望提供的類型。而在泛型類聲明的主體中使用類型參數來表示應該被替代的類型。


3.類型參數的約束

如果你在泛型類中,直接運用占位符來執行+ -操作的話,編譯器會直接報錯,因為此時編譯器並不知道T的具體類型,盡管所有的類型都繼承自System.Object,因為泛型類並不知道他們保存的是什麼類型,不會知道這些類型實現的成員。

看上述實例,就會發現為何在泛型類中多出了一個where字句,這就是用來約束占位符。

1.每個占位符都有自己的where子句

2.如果形參有多個約束,他們在where子句中使用逗號分隔

3.一般用到的約束如下

Class:任何引用類型,包括類、數組、委托和接口都可以用作實參

Struct:任何值類型都可以被用作類型實參

Interface:只有這個接口或者實現接口的類型才能用作實參

New():任何帶有無參構造函數的類型都可以用作實參,這叫做構造函數約束

/// <summary>
/// 泛型類
/// </summary>
/// <typeparam name="T1">泛型參數</typeparam>
/// <typeparam name="T2">泛型參數</typeparam>
class SomeClass<T1,T2> where T1 :class,new() where T2:class,new()
{
//根據泛型參數,創建一個類
public T1 SomeVar = new T1();
public T2 OtherVar = new T2();


}

/// <summary>
/// 泛型類
/// </summary>
/// <typeparam name="T1">泛型參數</typeparam>
/// <typeparam name="T2">泛型參數</typeparam>
class SomeClass<T1,T2> where T1 :class,new() where T2:class,new()
{
//根據泛型參數,創建一個類
public T1 SomeVar = new T1();
public T2 OtherVar = new T2();

}

看上述代碼,主要是注意一下泛型約束的格式規則

注意:泛型約束也會涉及到一個次序的問題,存在構造函數的約束,new()必須放在最後

4.泛型方法

既然知道了泛型類,泛型方法也就明白多了,寫法基本上是相同的。

/// <summary>
/// 泛型方法
/// </summary>
/// <typeparam name="S">泛型參數</typeparam>
/// <typeparam name="T">泛型參數</typeparam>
/// <param name="p">參數</param>
public void PrintData<S, T>(S p) where S : class
{
///代碼體
}

上面就是一個泛型方法的實例,基本的操作與普通的方法相似。

5.升華

說了這麼多,到底什麼是泛型?作為泛型我只提供了服務,但是我不太知道具體的執行人是什麼,也就是泛型占位符,但是只要你提供了執行者,也就是泛型參數,你就具有了相應的服務和功能。

C#多線程編程實例 線程與窗體交互【附源碼】 http://www.linuxidc.com/Linux/2014-07/104294.htm

C#數學運算表達式解釋器 http://www.linuxidc.com/Linux/2014-07/104289.htm

在C語言中解析JSON配置文件 http://www.linuxidc.com/Linux/2014-05/101822.htm

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

Copyright © Linux教程網 All Rights Reserved