返回實際收集和使用yield
之間的區別僅僅是您返回的對象的類型。
如果您返回實現IEnumerable<T>
的任何集合,則返回的對象的實際類型將爲該類型。例如,如果您返回List<T>
,則返回的引用將是IEnumerable<T>
類型,但引用指向的對象的實際類型是List<T>
的實例。
如果使用yield
,則編譯器將創建一個沒有已知名稱的枚舉器對象。返回的引用的類型也將是IEnumerable<T>
,但引用指向的對象的實際類型將是編譯器創建的內容。
例如得到一個枚舉的一個整數創建的類型名稱:
Console.WriteLine(Cat<int>(42).GetType().Name);
將顯示內部名稱,編譯器使用,例如這樣的結果,我從代碼有:
<Cat>d__5`1
如果該函數將返回一個List<int>
代替,類型將顯示爲:
List`1
爲讓編譯器創建此枚舉的動機可能只是它比這樣的短:
static IEnumerable<T> Cat<T>(T t) {
List<T> list = new List<T>(1);
list.Add(t);
return list;
}
(你可以把它寫使用快捷鍵有點短於C#的新版本,但仍沒有短到yield
)
當類型是一個集合,你可以施放參考實際類型和集合中更改值:
IEnumerable<int> ienum = Cat<int>(42);
((List<int>)ienum)[0] = 1337;
foreach (int value in ienum) {
Console.WriteLine(value);
}
將輸出:
1337
它是如何使用的? – Oded
這兩者彼此接近,但IEnumerable與列表不同,所選的方法是我可以想到的最簡單的方式來獲取其中的單個項目的集合。 –
48klocs