程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C# 2.0中泛型編程初級入門教程(4)

C# 2.0中泛型編程初級入門教程(4)

編輯:關於C語言

泛型中的靜態構造函數

靜態構造函數的規則:只能有一個,且不能有參數,他只能被.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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved