zz from WebCast—C#2.0銳利體驗
C# 2.0中的迭代器只是通過編譯器的一層額外處理,來簡化創建可用於foreach的枚舉集合的工作。
沒有迭代器的時候,創建一個可用於foreach的集合(C# 1.0):
{
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(this);
}
public class MyEnumerator : IEnumerator
{
public void Reset(){… }
public bool MoveNext(){ … }
public int Current{ get{ … } }
object IEnumerator.Current { get{ … } }
}
}
使用迭代器創建用於foreach的集合(C# 2.0):
{
T[] items;
int count;
public void Push(T data) {}
public T Pop() {return default(T);}
/*我覺得使用泛型接口IEnumerator<T>和IEnumerable<T>並沒有錯,但編譯卻有錯誤:error CS0536:“Test.TestStack<T>”不會實現接口成員“System.Collections.IEnumerable.GetEnumerator()”。Test.TestStack<T>.GetEnumerator()”或者是靜態、非公共的,或者有錯誤的返回類型。*/
public IEnumerator<T> GetEnumerator()
{
for(int i = count – 1; i >= 0; --i)
yield return items[i];
}
}
//下面的代碼用的非泛型接口IEnumerable,可以編譯通過並正確運行:)
public class TestStack<T>: IEnumerable
{
T[] items = new T[10];
int count=0;
public void Push(T data) {}
public T Pop() {return default(T);}
public IEnumerator GetEnumerator()
{
for(int i = count-1; i>= 0; --i)
yield return items[i];
}
}
使用foreach語句:
foreach (int i in stack) { ……. }
使用迭代器創建倒序遍歷:
{
get {
for (int i = 0; i < count; i++) {
yield return items[i];
}
}
}
使用yield return 產生枚舉元素:
yield return items[i];
}
使用yield break 中斷迭代:
yield return items[i];
if(items[i]>10)
yield break;
}