泛型(一)
泛型(C# 程式設計指南)
C# 語言和公共語言執行時 (CLR) 的 2.0 版本中新增了泛型。 泛型將型別引數的概念引入 .NET Framework
,這樣就可以設計具有以下特徵的類和方法:在客戶端程式碼宣告並初始化這些類和方法之前,這些類和方法會延遲指定一個或多個型別。 例如,通過使用泛型型別引數 T
,可以編寫其他客戶端程式碼能夠使用的單個類,而不會產生執行時轉換或裝箱操作的成本或風險,如下所示:
// 宣告泛型類
public class GenericList<T>
{
public void Add(T input) { }
}
class TestGenericList
{
private class ExampleClass { }
static void Main()
{
// 宣告int型別的列表
GenericList<int> list1 = new GenericList<int>();
list1.Add(1);
// 宣告型別字串列表
GenericList<string> list2 = new GenericList<string>();
list2.Add("");
// 宣告一個ExampleClass型別的列表
GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
list3.Add(new ExampleClass());
}
}
泛型概述
- 使用泛型型別可以最大限度地重用程式碼、保護型別安全性以及提高效能。
- 泛型最常見的用途是建立集合類。
.NET Framework
類庫在System.Collections.Generic
名稱空間中包含幾個新的泛型集合類。應儘可能使用這些類來代替某些類,如System.Collections
名稱空間中的ArrayList
。- 可以建立自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委託。
- 可以對泛型類進行約束以訪問特定資料型別的方法。
- 在泛型資料型別中所用型別的資訊可在執行時通過使用反射來獲取。
泛型介紹(C# 程式設計指南)
泛型類和泛型方法兼具可重用性、型別安全性和效率,這是非泛型類和非泛型方法無法實現的。 泛型通常與集合以及作用於集合的方法一起使用。 .NET Framework 2.0
版類庫提供新的名稱空間 System.Collections.Generic
,其中包含幾個新的基於泛型的集合類。 建議所有定目標到 .NET Framework 2.0
及更高版本的應用程式都使用新增的泛型集合類,而不是舊的非泛型集合類(如 ArrayList
)。 有關詳細資訊,請參閱 .NET 中的泛型。
當然,也可以建立自定義泛型型別和泛型方法,以提供自己的通用解決方案,設計型別安全的高效模式。 以下程式碼示例演示了出於演示目的的簡單泛型連結列表類。 (大多數情況下,應使用 .NET Framework
類庫提供的 List<T>
類,而不是自行建立類。)在通常使用具體型別來指示列表中所儲存項的型別的情況下,可使用型別引數 T
。 其使用方法如下:
- 在
AddHead
方法中作為方法引數的型別。 - 在
Node
巢狀類中作為Data
屬性的返回型別。 - 在巢狀類中作為私有成員
data
的型別。
請注意,T
可用於 Node
巢狀類。 如果使用具體型別例項化 GenericList<T>
(例如,作為 GenericList<int>
),則出現的所有 T
都將替換為 int
。
// 在尖括號中輸入引數T.
public class GenericList<T>
{
// 巢狀類在T上也是通用的.
private class Node
{
//T用於非泛型建構函式
public Node(T t)
{
next = null;
data = t;
}
private Node next;
public Node Next
{
get { return next; }
set { next = value; }
}
// T作為私有成員資料型別
private T data;
// T作為返回型別的屬性
public T Data
{
get { return data; }
set { data = value; }
}
}
private Node head;
// 建構函式
public GenericList()
{
head = null;
}
//T作為方法引數型別:
public void AddHead(T t)
{
Node n = new Node(t);
n.Next = head;
head = n;
}
public IEnumerator<T> GetEnumerator()
{
Node current = head;
while (current != null)
{
yield return current.Data;
current = current.Next;
}
}
}
以下程式碼示例演示了客戶端程式碼如何使用泛型 GenericList<T>
類來建立整數列表。 只需更改型別引數,即可輕鬆修改以下程式碼,建立字串或任何其他自定義型別的列表:
class TestGenericList
{
static void Main()
{
// int是型別引數
GenericList<int> list = new GenericList<int>();
for (int x = 0; x < 10; x++)
{
list.AddHead(x);
}
foreach (int i in list)
{
System.Console.Write(i + " ");
}
System.Console.WriteLine("\nDone");
}
}
相關文章
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- 泛型類、泛型方法及泛型應用泛型
- 泛型類和泛型方法泛型
- 【java】【泛型】泛型geneticJava泛型
- java泛型之泛型方法。Java泛型
- c#泛型續(一)C#泛型
- C++泛型一:模板C++泛型
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- TypeScript 泛型介面和泛型類TypeScript泛型
- Go 泛型之泛型約束Go泛型
- java泛型之泛型陣列。Java泛型陣列
- 泛型泛型
- Java的泛型詳解(一)Java泛型
- 詳解C#泛型(一)C#泛型
- Java 集合列舉泛型(一)Java泛型
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- Go 1.18 泛型全面講解:一篇講清泛型的全部Go泛型
- 型別 VS 泛型型別泛型
- TypeScript 泛型型別TypeScript泛型型別
- 泛型的下一步泛型
- 泛型程式設計詳解(一)泛型程式設計
- 一文理解TS泛型泛型
- 泛型(三)泛型
- 泛型(二)泛型
- 泛型(四)泛型
- 泛型(五)泛型
- Go 泛型Go泛型
- va泛型泛型
- Java 泛型Java泛型
- 泛型viewmodle泛型View
- Java泛型Java泛型
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 【譯】在非泛型類中建立泛型方法泛型
- 泛型型別(.NET 指南)泛型型別
- Go 官方出品泛型教程:如何開始使用泛型Go泛型
- Java函式泛型List引數,操作泛型元素Java函式泛型
- JAVA泛型使用練習2(自定義泛型使用)Java泛型
- 泛型類及系統中常用的泛型類泛型