因為 IL 和 CLR 為泛型提供本機支援,所以大多數符合 CLR 的語言都可以利用一般類型。例如,下面這段 Visual Basic .NET 代碼使用
代碼塊 2 的一般堆棧:Dim stack As Stack(Of Integer)
stack = new Stack(Of Integer)
stack.Push(3)
Dim number As Integer
number = stack.Pop()
您可以在類和結構中使用泛型。以下是一個有用的一般點結構:public struct Point
{
public T X;
public T Y;
}
可以使用該一般點來表示整數座標,例如:
Point point;
point.X = 1;
point.Y = 2;
或者,可以使用它來表示要求浮點精度的圖表座標:
Point point;
point.X = 1.2;
point.Y = 3.4;
除了到目前為止介紹的基本泛型文法以外,C# 2.0 還具有一些泛型特定的文法。
例如,請考慮代碼塊 2 的 Pop() 方法。假設您不希望在堆棧為空白時引發異常,而是希望返回堆棧中儲存的類型的預設值。如果您使用基於 Object 的堆棧,則可以簡單地返回 null,但是您還可以通過實值型別來使用一般堆棧。為瞭解決該問題,您可以使用 default() 運算子,它傳回型別的預設值。
下面說明如何在 Pop() 方法的實現中使用預設值:
public T Pop()
{
m_StackPointer--;
if(m_StackPointer >= 0)
{
return m_Items[m_StackPointer];
}
else
{
m_StackPointer = 0;
return default(T);
}
}
參考型別的預設值為 null,而實值型別(例如,整型、枚舉和結構)的預設值為全零(用零填充相應的結構)。因此,如果堆棧是用字串構建的,則 Pop() 方法在堆棧為空白時返回 null;如果堆棧是用整數構建的,則 Pop() 方法在堆棧為空白時返回零。
多個一般類型:
單個類型可以定義多個一般型別參數。例如,請考慮代碼塊 3 中顯示的一般鏈表。
代碼塊 3. 一般鏈表
class Node
{
public K Key;
public T Item;
public Node NextNode;
public Node()
{
Key = default(K);
Item = defualt(T);
NextNode = null;
}
public Node(K key,T item,Node nextNode)
{
Key = key;
Item = item;
NextNode = nextNode;
}
}
public class LinkedList
{
Node m_Head;
public LinkedList()
{
m_Head = new Node();
}
public void AddHead(K key,T item)
{
Node newNode = new Node(key,item,m_Head.NextNode);
m_Head.NextNode = newNode;
}
}
該鏈表格儲存體節點:class Node
{}
每個節點都包含一個鍵(屬於一般型別參數 K)和一個值(屬於一般型別參數 T)。每個節點還具有對該列表中下一個節點的引用。鏈表本身根據一般型別參數 K 和 T 進行定義:public class LinkedList
{}
這使該列表可以公開像 AddHead() 一樣的一般方法:
public void AddHead(K key,T item);
每當您聲明使用泛型的類型的變數時,都必須指定要使用的類型。但是,指定的類型實參本身可以為一般型別參數。例如,該鏈表具有一個名為 m_Head 的 Node 類型的成員變數,用於引用該列表中的第一個項。m_Head 是使用該列表自己的一般型別參數 K 和 T 聲明的。
您需要在執行個體化節點時提供類型實參;同樣,您可以使用該鏈表自己的一般型別參數:
public void AddHead(K key,T item){Node newNode = new Node<K,T>(key,item,m_Head.NextNode);m_Head.NextNode = newNode;}
請注意,該列表使用與節點相同的名稱來表示一般型別參數完全是為了提高可讀性;它也可以使用其他名稱,例如:
public class LinkedList{...}
或:
public class LinkedList{...}
在這種情況下,將 m_Head 聲明為:
Node m_Head;
當用戶端使用該鏈表時,該用戶端必須提供類型實參。該用戶端可以選擇整數作為鍵,並且選擇字串作為資料項目:
LinkedList list = new LinkedList();list.AddHead(123,"AAA");
但是,該用戶端可以選擇其他任何組合(例如,時間戳記)來表示鍵:
LinkedList list = new LinkedList();list.AddHead(DateTime.Now,"AAA");
有時,為特定類型的特殊組合起別名是有用的。可以通過 using 陳述式完成該操作,如代碼塊 4 中所示。請注意,別名的作用範圍是檔案的作用範圍,因此您必須按照與使用 using 命名空間相同的方式,在專案檔中反覆起別名。
代碼塊 4. 一般類型別名
using List = LinkedList;
class ListClient
{
static void Main(string[] args)
{
List list = new List();
list.AddHead(123,"AAA");
}
}