C# 泛型是什麼、泛型緩存、泛型約束 騰訊課堂筆記

1. 什麼是泛型

List<T>
泛型就是寬泛的,不確定的類型 帶尖括號的;
泛型包括且只有:泛型方法、泛型類、泛型接口、泛型委託;

泛型是因.Net Framework2.0框架升級而出來的:
1.編譯器要升級,編譯器能夠支持類型參數,就是用佔位符來表達, 1、2來表示,數字表示泛型類型參數個數。
2.CLR(公共語言運行庫),也需要升級,才能支持佔位符,運行的時候,類型確定,會把佔位符替換成具體的類型。

泛型不是語法糖:
語法糖是編譯器提供的便捷功能
比如 var i = 1234; 編譯器自動識別出來是int類型,這個var就是語法糖。

2. 泛型方法

泛型方法就是方法名後面加尖括號<>;

Show (T params)

T:類型參數 typeparam
T是什麼,它是一個佔位符,T想要是什麼就是什麼,其實在編譯器編譯的時候並不指定是什麼,知道CLR/JIT即時編譯的時候才確定是什麼類型,那麼是怎麼確定的呢?

其實是因爲在編譯的時候,會針對於泛型給定一個佔位符如:`1, `2, `3,數字表示參數個數,

然後在JIT即時編譯的時候,會把泛型(佔位符)替換掉,這時候就明確了具體是什麼類型,

那麼爲什麼是再JIT即時編譯時確定呢?因爲這之後就是機器碼執行了,機器碼執行時肯定要知道時什麼類型,不然沒法執行,

說白了 T只是一個佔位符,類型在聲明的時候其實不確定,在調用的時候確定類型,這叫做 “延遲聲明”,推遲一切可以推遲的,能晚點就晚點。

泛型方法:
延遲申明,性能和普通方法差不多,可以用一個方法滿足多種類型的需求。

3. 爲什麼要使用泛型?

當我們寫的功能相同或相似,但是處理的數據的類型不同的時候,就需要寫很多的方法或類,這時候使用泛型就只需要寫一個方法或類就可以了;

比如 在做數據庫查詢的時候,每一個實體都對應一個不同的表,如果每個實體都要寫一個方法的話,就會造成代碼冗餘;

另一個減少代碼的選項是Object類,
爲什麼呢?
因爲object作爲參數類型,調用的時候,可以把任何類型都傳進來,
1.C#任何父類出現的地方都可以用子類代替;
2.Object是一切類型的基類;
但是存在2個問題?
1.這裏會出現裝箱和拆箱,性能損耗比較大;
2.派生自Object類的類型進行傳遞是不安全的;

4. 泛型緩存

緩存

緩存:其實就是一個暫存區,從數據庫把數據取出來,然後放到一個暫存區,之後再去查詢這個數據的時候就可以直接從緩存裏面取就好,不用再取訪問數據庫,這就叫做緩存。

通常都是用的字典緩存(Dictionary鍵值對的形式),
先定義一個字段,第一次進來去字典裏判斷,如果沒有的話就保存到字典裏,然後下次再訪問的時候就從字典裏面取,
定義爲一個靜態變量,保證在整個內存中是有且唯一的緩存。

泛型緩存

必須是一個泛型類
在第一次執行的時候會執行靜態構造函數,之後就不會再執行到;
它會根據傳入的不同類型,
爲每一個類型生成一個副本;
在使用泛型緩存的時候,其實相當於是去調用一個普通的類;

跟普通緩存的區別:
泛型緩存效率遠遠高於普通緩存

5. 泛型接口

//泛型接口
public interface ShowInterface<T>
{
}

6. 泛型委託

//泛型委託
public delegate void Do<T>;

7. 泛型約束

其實就是約束T的類型
在參數最後加上where關鍵字

//基類約束
public static void Show<T>(T tParam)
	where T : People //基類約束,只能是People,所以這裏的參數只能傳入People或People的子類
{
	Console.WriteLine(tParam.Id);
}
//接口約束
public static void Show<T>(T tParam)
	where T : IPeople
{
	Console.WriteLine(tParam.Id);
}
//引用類型參數
public static void Show<T>(T tParam)
	where T : class //只能傳入引用類型的參數
{
	Console.WriteLine(tParam.Id);
}

//值類型參數
public static void Show<T>(T tParam)
	where T : strict //只能傳入值類型的參數
{
	Console.WriteLine(tParam.Id);
}

//無參數構造函數參數
public static void Show<T>(T tParam)
	where T : strict //只能傳入無參數構造函數參數的參數
{
	Console.WriteLine(tParam.Id);
}

可以多個約束一起用嗎?
視情況而定
如值類型+引用類型約束就不可以
如果是引用類型+無參數構造函數約束就可以,用逗號分隔

泛型約束的好處:
1.加了約束以後可以獲取更多的功能;
2.保證程序的準確性,穩定性
3.程序在調用的時候可以避免錯誤調用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章