程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#語言的未來功能(2)

C#語言的未來功能(2)

編輯:關於C語言

如果將一個值類型(例如一個整數)傳遞給 Push 方法,運行時會自動將其轉換為引用類型(該過程稱作裝箱),然後將其存儲在內部數據結構中。與此類似,如果程序要從堆棧中檢索一個值類型(例如一個整數),則需要將從 Pop 方法獲取的對象類型顯式轉換成值類型,該過程稱作取消裝箱:

Stack s = new Stack();
s.Push(3);
int i = (int) s.Pop();

值類型和引用類型之間的裝箱和取消裝箱操作非常繁重。

而且,在當前的實現中,無法限制堆棧中放置的數據類型。實際上,可以先創建堆棧,然後將 Customer 類型壓入堆棧。然後,可使用同一堆棧並嘗試將數據彈出,接著將其轉換為其他類型,如下例所示:

Stack s = new Stack();
s.Push(new Customer());
Employee e = (Employee) s.Pop();

盡管上一個代碼示例錯誤地使用了要實現的單個類型 Stack 類,應視為錯誤,但它實際上卻是合法代碼,對它進行編譯時不會出現問題。但在運行時,該程序會由於無效轉換操作而失敗。

創建和使用泛型

使用 C# 中的泛型可以根據它們所用的類型創建專供編譯器使用的高效數據結構。創建這些所謂的參數化類型後,其內部算法保持不變,但其內部數據的類型可以隨著最終用戶的設置而改變。

為了幫助開發人員節省學習該語言的時間,C# 中泛型的聲明方法與 C++ 中的大致相同。程序員可以按通常的方法創建類和結構,並使用尖括號標記(< 和 >)指定類型參數。使用類時,必須用該類的用戶提供的實際類型替換每個參數。

下例將創建一個 Stack 類,在此類聲明後的尖括號中指定並聲明一個名為 ItemType 的類型參數。泛型 Stack 類的實例將接受為其創建的類型並在本地存儲該類型的數據,而不是在創建的類型與基本對象類型之間進行轉換。類型參數 ItemType 充當代理,直到在實例化過程中指定了類型並將其用作內部項數組的類型(即 Push 方法的參數類型和 Pop 方法的返回類型):

public class Stack<ItemType>
{
  private ItemType[] items;
  public void Push(ItemType data)
  {
    ...
  }
  public ItemType Pop()
  {
    ...
  }
}

當程序按照以下示例使用 Stack 類時,您可以指定泛型類使用的實際類型。本例使用實例化語句中的尖括號標記將原始的整數類型指定為參數,指示 Stack 類使用此類型:

Stack<int> stack = new Stack<int>();
stack.Push(3);
int x = stack.Pop();

執行此操作時,程序將創建 Stack 類的新實例,其中的每個 ItemType 都被提供的整數參數替換。實際上,當程序用整數參數創建 Stack 類的新實例時,在 Stack 類內部本地存儲的項目數組將為整數,而不是對象。程序還消除了與將整數壓入堆棧相關聯的裝箱問題。此外,當程序從堆棧彈出項目時,您無需將其顯式轉換為相應的類型,因為 Stack 類的當前特定實例會將整數本地存儲在其數據結構中。

如果希望程序在 Stack 類中存儲其他類型的項目,則必須創建一個 Stack 類的新實例並將新類型指定為參數。假設有一個簡單的 Customer 類型,希望程序使用 Stack 對象存儲該類型。要實現此操作,只需實例化 Stack 類並將 Customer 對象作為其類型參數,即可輕松重復使用程序代碼:

Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
Customer c = stack.Pop();

當然,如果程序創建了一個將 Customer 類型作為參數的 Stack 類,則只能在該堆棧中存儲 Customer 類型。實際上,C# 中的泛型具有嚴格的類型,這意味著您不能在該堆棧中存儲整數,如以下示例所示:

Stack<Customer> stack = new Stack<Customer>();
stack.Push(new Customer());
stack.Push(3) // 編譯時錯誤
Customer c = stack.Pop();   // 不需要類型轉換。
泛型的優點

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