目錄
- C#泛型
- 概述
- 什麼是泛型?
- 泛型有什麼用?
- 基本語法
- 1.泛型方法
Method<T>
- 2.泛型類
class GenericClass<T>{}
- 3.泛型介面
public interface GenericInterface<T>{}
- 4.泛型委託
public delegate void GenericDelegate<T>(T t)
- 5.泛型約束(對T資料型別的約束)
class GenericClass<T>{} where T:約束
- 1.泛型方法
- 使用場景
- 總結
- 引用
- 概述
C#泛型
概述
什麼是泛型?
泛型是C#2.0中推出的新語法,泛型不是語法糖,而且由框架升級提供的功能。
泛型(Generics)是一種程式設計正規化,它允許您編寫可與任何資料型別一起工作的程式碼。泛型透過使用型別引數來實現這一點,型別引數是在建立泛型型別或方法的例項時指定的佔位符。
泛型有什麼用?
- 我們在程式設計的時候經常遇到功能非常相似但是資料型別不同的情況,但是我們沒有辦法,只能分別寫多個不同的方法或類來處理不同的資料型別。泛型就是專門來解決同一個類或方法可以傳入不同的資料型別。
- 泛型可以最大程度的重用程式碼、保護型別安全性以及提高效能。.Net常見的泛型 如:
List<T>、Dictionary<TKey, TValue>、Queue<T>、Func<T>
,其中T就可以是任意資料型別。我們也可以自定義泛型。 - 泛型包括:泛型類、泛型方法、泛型介面、泛型委託、泛型事件。
基本語法
1.泛型方法 Method<T>
// 方法定義
public static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
//方法呼叫
int a = 1, b = 2;
Swap<int>(ref a, ref b);
Console.WriteLine($"a={a}, b={b}");
2.泛型類 class GenericClass<T>{}
//類定義
public class Stack<T>
{
int position;
T[] data = new T[100];
public void Push(T obj)
{
data[position++] = obj;
}
public T Pop()
{
return data[--position];
}
}
//類例項化
var stack = new Stack<int>();
stack.Push(1);
stack.Push(2);
stack.Push(3);
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
Console.WriteLine(stack.Pop());
3.泛型介面 public interface GenericInterface<T>{}
4.泛型委託 public delegate void GenericDelegate<T>(T t)
5.泛型約束(對T資料型別的約束) class GenericClass<T>{} where T:約束
where T:struct 型別引數必須是值型別。
where T:class 型別引數必須是引用型別,此約束還應用於任何類、介面、委託或陣列型別。
where T:new() 型別引數必須具有公共無引數的建構函式。當與其他約束一起使用時,new() 約束必須最後指定。
where T:<基類名> 型別引數必須是指定的基類或派生自指定的基類。
where T:<介面名> 型別引數必須是指定的介面或實現指定的介面。
- 主約束出現在型別引數列表的第一個位置,並且必須滿足才能使用泛型型別。主約束通常用於指定型別引數的基本型別,例如值型別或引用型別。
- 次要約束 出現在主約束之後,並且可以有多個。次要約束用於指定型別引數必須實現的介面或繼承的類。
//其中 class為主要約束,new() 為次要約束
Stack<T> where T : class,new()
使用場景
- 集合類: 泛型集合類可以儲存各種型別的資料,例如
List<T>, Dictionary<TKey, TValue>, Queue<T>, Stack<T>
等。 - 資料結構: 泛型資料結構可以實現各種資料結構,例如連結串列、樹、圖等。
- 演算法: 泛型演算法可以實現各種演算法,例如排序、搜尋、加密等。
- 資料庫操作: 泛型可以用於簡化資料庫操作,例如 ORM 框架。
- 網路程式設計: 泛型可以用於簡化網路程式設計,例如 HTTP 客戶端庫。
總結
泛型是一種非常強大的程式設計工具,可以顯著提高程式碼的重用性、型別安全性、效能和可擴充套件性。
引用
-
博文示例程式碼 https://github.com/chi8708/DotNetNote/blob/master/Note.Basic/08Generic
-
https://www.cnblogs.com/dgg2015/p/12362415.html