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

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

編輯:關於C語言
他語言中的泛型支持

Microsoft 的目標是在 Visual J#(TM)、Visual C++ 和 Visual Basic 中支持使用和創建泛型。盡管不同語言實現此功能的時間有早有晚,但 Microsoft 的所有其他三種語言都將包含對泛型的支持。同時,C# 小組正努力在泛型的基礎運行時中加入相應的功能,為實現多語言支持奠定基礎。Microsoft 與第三方語言合作伙伴緊密協作,以確保在基於 .Net 的語言中創建和使用泛型。

迭代程序

迭代程序是基於研究語言中的類似功能(例如 CLU、Sather 和 Icon)而構造的語言。簡單說來,通過迭代程序,類型可輕松地聲明 foreach 語句對其元素進行迭代的方式。

為什麼需要迭代程序

現在,如果類需要使用 foreach 循環結構支持迭代操作,則它們必須實現“枚舉器模式”。例如,編譯器將左側的 foreach 循環結構擴展為右側的 while 循環結構:

List list = ...;
foreach(object obj in list)
{
DOSomething(obj);
}
Enumerator e = list.GetEnumerator();
while(e.MoveNext())
{
  object obj = e.Current;
  DOSomething(obj);

值得注意的是,為了使 foreach 循環能夠正常運行,List 數據結構(所迭代的實例)必須支持 GetEnumerator 函數。創建 List 數據結構後,必須實現 GetEnumerator 函數,以返回 ListEnumerator 對象:

public class List
{
  internal object[] elements;
  internal int count;
  public ListEnumerator GetEnumerator()
  {
    return new ListEnumerator(this);
  }
}

所創建的 ListEnumerator 對象不僅必須實現 Current 屬性和 MoveNext 方法,而且還必須維護其內部狀態,以便程序在每次執行該循環時都可以移到下一項。此內部狀態機對於 List 數據結構而言比較簡單,但對於需要遞歸循環的數據結構(例如二叉樹)來說,該狀態機將相當復雜。

由於實現此枚舉器模式需要開發人員投入大量的精力並編寫大量代碼,因此 C# 包含一種新的結構,使得類可以輕松地指示 foreach 循環對其內容進行迭代的方式。

定義迭代程序

由於迭代程序是 foreach 循環結構的邏輯對應物,因此其定義方式類似於函數:使用 foreach 關鍵字並在後面帶有一對圓括號。在以下示例中,程序將為 List 類型聲明一個迭代程序。迭代程序的返回類型由用戶決定,但是由於 List 類內部存儲的是對象類型,因此以下迭代程序示例的返回類型為對象:

public class List
{
  internal object[] elements;
  internal int count;
  public object foreach()
  {
  }
}

值得注意的是,實現枚舉器模式後,程序需要維護內部狀態機以便跟蹤程序在數據結構中的位置。迭代程序具有內置狀態機。使用新的 yield 關鍵字,程序可以將值返回到調用該迭代程序的 foreach 語句。當 foreach 語句下次循環並再次調用迭代程序時,此迭代程序將在上一個 yIEld 語句停止的位置開始執行。在以下示例中,程序將生成三個字符串類型:

public class List
{
  internal object[] elements;
  internal int count;
  public string foreach()
  {
    yIEld "microsoft";
    yIEld "corporation";
    yIEld "developer division";
  }
}

在以下示例中,調用此迭代程序的 foreach 循環將執行三次,每次都會按照前三個 yIEld 語句指定的順序接收字符串:

List list = new List();
foreach(string s in list)
{
Console.WriteLine(s);
}

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