程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C# 2.0:使用匿名方法、迭代程序和局部類來創建優雅的代碼(7)

C# 2.0:使用匿名方法、迭代程序和局部類來創建優雅的代碼(7)

編輯:關於C語言

public void Add (params T[] items);

這棵樹提供了一個 IEnumerable <T> 類 型的名為 InOrder 的公共屬性。InOrder 調用遞歸的私有幫助器方法 ScanInOrder,把樹的根節點傳遞給 ScanInOrder。ScanInOrder 定義如下:

IEnumerable<T> ScanInOrder(Node<T> root);

它返回 IEnumerable <T> 類型的迭代程序的實現,此實 現按順序遍歷二叉樹。對於 ScanInOrder 需要注意的一件事情是,它通過遞歸遍 歷這個二叉樹的方式,即使用 foreach 循環來訪問從遞歸調用返回的 IEnumerable <T>。在順序 (in-order) 迭代中,每個節點都首先遍歷它左 邊的子樹,接著遍歷該節點本身的值,然後遍歷右邊的子樹。對於這種情況,需 要三個 yield return 語句。為了遍歷左邊的子樹,ScanInOrder 在遞歸調用( 它以參數的形式傳遞左邊的節點)返回的 IEnumerable <T>上使用 foreach 循環。一旦 foreach 循環返回,就已經遍歷並產生了左邊子樹的所有節 點。然後,ScanInOrder 產生作為迭代的根傳遞給其節點的值,並在 foreach 循 環中執行另一個遞歸調用,這次是在右邊的子樹上。通過使用屬性 InOrder,可 以編寫下面的 foreach 循環來遍歷整個樹:

BinaryTree<int> tree = new BinaryTree<int> ();
tree.Add(4,6,2,7,5,3,1);
foreach(int num in tree.InOrder)
{
  Trace.WriteLine(num);
}
// Traces 1,2,3,4,5,6,7

可以通過添加其他的屬性用相似的方式實現前 序 (pre-order) 和後序 (post-order) 迭代。雖然以遞歸方式使用迭代程序的能 力顯然是一個強大的功能,但是在使用時應該保持謹慎,因為可能會出現嚴重的 性能問題。每次調用 ScanInOrder 都需要實例化編譯器生成的迭代程序,因此, 遞歸遍歷一個很深的樹可能會導致在幕後生成大量的對象。在對稱二叉樹中,大 約有 n 個迭代程序實例,其中 n 為樹中節點的數目。在任一特定的時刻,這些 對象中大約有 log(n) 個是活的。在具有適當大小的樹中,許多這樣的對象會使 樹通過 0 代 (Generation 0) 垃圾回收。也就是說,通過使用棧或隊列維護一列 將要被檢查的節點,迭代程序仍然能夠方便地遍歷遞歸數據結構(例如樹)。

局部類型

C# 1.1 要求將類的全部代碼放在一個文件中。而 C# 2.0 允 許將類或結構的定義和實現分開放在多個文件中。通過使用 new partial 關鍵字 來標注分割,可以將類的一部分放在一個文件中,而將另一個部分放在一個不同 的文件中。例如,可以將下面的代碼放到文件 MyClass1.cs 中:

public partial class MyClass
{
  public void Method1()
  {...}
}

在文件 MyClass2.cs 中,可以插入 下面的代碼:

public partial class MyClass
{
  public void Method2()
  {...}
  public int Number;
}

實際上,可以將任一特定的類分割成任意多的部分。局部類型支持可 以用於類、結構和接口,但是不能包含局部枚舉定義。

局部類型是一個非 常有用的功能。有時,我們需要修改機器生成的文件,例如 Web 服務客戶端包裝 類。然而,當重新生成此包裝類時,對該文件的修改將會被丟棄。通過使用局部 類,可以將這些改變分開放在單獨的文件中。ASP.Net 2.0 將局部類用於 code- beside 類(從 code-behind 演變而來),單獨存儲頁面中機器生成的部分。 Windows 窗體使用局部類來存儲 InitializeComponent 方法的可視化設計器輸出 以及成員控件。通過使用局部類型,兩個或者更多的開發人員可以工作在同一個 類型上,同時都可以從源控制中簽出其文件而不互相影響。

您可以問自己 ,如果多個不同的部分對同一個類做出了相互矛盾的定義會出現什麼樣的後果? 答案很簡單。一個類(或一個結構)可能具有兩個不同的方面或性質:累積性的 (accumulative) 和非累積性的 (non-accumulative)。累積性的方面是指類可以 選擇添加它的各個部分,比如接口派生、屬性、索引器、方法和成員變量。

例如,下面的代碼顯示了一個部分是如何添加接口派生和實現的:

public partial class MyClass
{}
public partial class MyClass : IMyInterface
{
  public void Method1()
  {...}
  public void Method2()
  {...}
}

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