爲什麼Enumerator
不跟蹤同一個函數中的項目,但是如果MoveNext
操作在其他函數中發生則不會跟蹤該項目?枚舉器和函數示波器
例子:
public static void Test()
{
var array = new List<Int32>(new Int32[] { 1, 2, 3, 4, 5 });
var e = array.GetEnumerator();
e.MoveNext();
e.MoveNext();
Console.WriteLine(e.Current); // 2
Incremenet(e);
Console.WriteLine(e.Current); //2
}
static void Incremenet(IEnumerator<Int32> e)
{
Console.WriteLine("Inside " + e.Current); //2
e.MoveNext();
Console.WriteLine("Inside " + e.Current); // 3
e.MoveNext();
Console.WriteLine("Inside " + e.Current); //4
}
我期待得到5在過去的CW,但我得到2,就像是從來沒有增加。當函數返回時,爲什麼Increment
函數內的MoveNext
被遺忘了?
乾杯。
他們不得不在外部公開它。如果他們沒有把它暴露在外面,那麼它總會被裝箱,如果它總是被裝箱的話,它可能剛開始就是一個班級。目的是它實際上總是被一個'foreach'使用,它可以和值類型語義正確地工作。如果結構沒有公開暴露,那麼'foreach'不能在沒有裝箱的情況下抽出枚舉器。 (至少沒有特殊的編譯器支持,比如對陣列完成) – Servy
@Servy好點,好信息,我已經改變了我的答案。 –
@Servy我仍然不清楚爲什麼它被做成一個'struct'而不是'''''密封'/非'虛擬'的東西。這可以讓你生成接近完全相同的IL,我認爲它具有相似的性能。 –