泛型中的靜態構造函數
靜態構造函數的規則:只能有一個,且不能有參數,他只能被.Net 運行時自動調用,而不能人工調用。
泛型中的靜態構造函數的原理和非 泛型類是一樣的,只需把泛型中的不同的封閉類理解為不同的類即可。以下兩種 情況可激發靜態的構造函數:
1. 特定的封閉類第一次被實例化。
2. 特定封閉類中任一靜態成員變量被調用。
泛型類中的方法重 載
方法的重載在.Net Framework中被大量應用,他要求重載具有不同的 簽名。在泛型類中,由於通用類型T在類編寫時並不確定,所以在重載時有些注 意事項,這些事項我們通過以下的例子說明:
public class Node<T, V>
{
public T add(T a, V b) //第一個add
{
return a;
}
public T add(V a, T b) //第二 個add
{
return b;
}
public int add(int a, int b) //第三個add
{
return a + b;
}
}
上面的類很明顯,如果T和V都傳入int的話,三個add方法將具有 同樣的簽名,但這個類仍然能通過編譯,是否會引起調用混淆將在這個類實例化 和調用add方法時判斷。請看下面調用代碼:
Node<int, int> node = new Node<int, int>();
object x = node.add(2, 11);
這個Node的實例化引起了三個add具有同樣的簽名,但卻能 調用成功,因為他優先匹配了第三個add。但如果刪除了第三個add,上面的調用 代碼則無法編譯通過,提示方法產生的混淆,因為運行時無法在第一個add和第 二個add之間選擇。
Node<string, int> node = new Node<string, int>();
object x = node.add(2, "11");
這兩行調用代碼可正確編譯,因為傳入的 string和int,使三個add具有不同的簽名,當然能找到唯一匹配的add方法。
由以上示例可知,C#的泛型是在實例的方法被調用時檢查重載是否產生 混淆,而不是在泛型類本身編譯時檢查。同時還得出一個重要原則:
當 一般方法與泛型方法具有相同的簽名時,會覆蓋泛型方法。
泛型類的方 法重寫
方法重寫(override)的主要問題是方法簽名的識別規則,在這 一點上他與方法重載一樣,請參考泛型類的方法重載。
泛型的使用范圍
本文主要是在類中講述泛型,實際上,泛型還可以用在類方法、接口、 結構(struct)、委托等上面使用,使用方法大致相同,就不再講述。
小結
C# 泛型是開發工具庫中的一個無價之寶。它們可以提高性能、類型 安全和質量,減少重復性的編程任務,簡化總體編程模型,而這一切都是通過優 雅的、可讀性強的語法完成的。盡管 C# 泛型的根基是 C++ 模板,但 C# 通過 提供編譯時安全和支持將泛型提高到了一個新水平。C# 利用了兩階段編譯、元 數據以及諸如約束和一般方法之類的創新性的概念。毫無疑問,C# 的將來版本 將繼續發展泛型,以便添加新的功能,並且將泛型擴展到諸如數據訪問或本地化 之類的其他 .Net Framework 領域。Q