yield(C# 参考)
yield(C# 參考)
yield(C# 參考)
在語句中使用 yield 關鍵字,表示在該關鍵字所在的方法、運算符或 get 訪問器是迭代器。 ??通過使用 yield 定義迭代器,可在實現自定義集合類型的 IEnumerable 和 IEnumerator 模式時無需其他顯式類(保留枚舉狀態的類,有關示例,請參閱 IEnumerator<T>)。??下面的示例演示了 yield 語句的兩種形式。
復制???????????? yield return <expression>; yield break;使用 yield return 語句可一次返回一個元素。
通過 foreach 語句或 LINQ 查詢來使用迭代器方法。???? foreach 循環的每次迭代都會調用迭代器方法。??迭代器方法運行到 yield return 語句時,會返回一個 expression,并保留當前在代碼中的位置。???? 當下次調用迭代器函數時執行從該位置重新啟動。 ??
可以使用 yield break 語句來終止迭代。
有關迭代器的詳細信息,請參閱迭代器(C# 和 Visual Basic)。
迭代器的聲明必須滿足以下要求:
-
返回類型必須為 IEnumerable、IEnumerable<T>、IEnumerator 或 IEnumerator<T>。
-
該聲明不能有任何 ref 或out https://msdn.microsoft.com/zh-cn/library/t3c3bfhx.aspx 參數。
返回 IEnumerable 或 IEnumerator 的迭代器的 yield 類型為 object。如果迭代器返回 IEnumerable<T> 或 IEnumerator<T>,則必須將 yield return 語句中的表達式類型隱式轉換為泛型類型參數。
你不能在具有以下特點的方法中包含 yield return 或 yield break 語句:
-
匿名方法。??有關詳細信息,請參閱匿名方法(C# 編程指南)。??
-
包含不安全的塊的方法。??有關詳細信息,請參閱unsafe(C# 參考)。??
不能將 yield return 語句置于 try-catch 塊中。??可將 yield return 語句置于 try-finally 語句的 try 塊中。??
yield break???? 語句可以位于 try 塊或 catch? 塊,但不能位于 finally 塊。
如果 foreach 主體(在迭代器方法之外)引發異常,則將執行迭代器方法中的 finally 塊。
以下代碼從迭代器方法返回 IEnumerable<string>,然后遍歷其元素。
C# 復制???????????? IEnumerable<string> elements = MyIteratorMethod(); foreach (string element in elements) {… }調用 MyIteratorMethod 并不執行該方法的主體。??相反,該調用會將 IEnumerable<string> 返回到 elements 變量中。??
在 foreach 循環迭代時,將為 elements 調用 MoveNext 方法。??此調用將執行 MyIteratorMethod 的主體,直至到達下一個 yield return 語句。???? yield return 語句返回的表達式不僅決定了循環體使用的 element 變量值,還決定了元素的 Current 屬性(它是 IEnumerable<string>)。??
在 foreach 循環的每個后續迭代中,迭代器主體的執行將從它暫停的位置繼續,直至到達 yield return 語句后才會停止。??在到達迭代器方法的結尾或 yield break 語句時,foreach 循環便已完成。??
示例
下面的示例包含一個位于 for 循環內的 yield return 語句。???? Process 中的 foreach 語句體的每次迭代都會創建對 Power 迭代器函數的調用。??對迭代器函數的每個調用將繼續到 yield return 語句的下一次執行(在 for 循環的下一次迭代期間發生)。??
迭代器方法的返回類型是 IEnumerable(一種迭代器接口類型)。??當調用迭代器方法時,它將返回一個包含數字冪的可枚舉對象。??
C# 復制???????????? public class PowersOf2 {static void Main(){// Display powers of 2 up to the exponent of 8:foreach (int i in Power(2, 8)) { Console.Write("{0} ", i); } } public static System.Collections.Generic.IEnumerable<int> Power(int number, int exponent) { int result = 1; for (int i = 0; i < exponent; i++) { result = result * number; yield return result; } } // Output: 2 4 8 16 32 64 128 256 }示例
下面的示例演示一個作為迭代器的 get 訪問器。??在該示例中,每個 yield return 語句返回一個用戶定義的類的實例。??
C# 復制???????????? public static class GalaxyClass {public static void ShowGalaxies() { var theGalaxies = new Galaxies(); foreach (Galaxy theGalaxy in theGalaxies.NextGalaxy) { Debug.WriteLine(theGalaxy.Name + " " + theGalaxy.MegaLightYears.ToString()); } } public class Galaxies { public System.Collections.Generic.IEnumerable<Galaxy> NextGalaxy { get { yield return new Galaxy { Name = "Tadpole", MegaLightYears = 400 }; yield return new Galaxy { Name = "Pinwheel", MegaLightYears = 25 }; yield return new Galaxy { Name = "Milky Way", MegaLightYears = 0 }; yield return new Galaxy { Name = "Andromeda", MegaLightYears = 3 }; } } } public class Galaxy { public String Name { get; set; } public int MegaLightYears { get; set; } } }有關更多信息,請參見C# 語言規范。 該語言規范是 C# 語法和用法的權威資料。
posted on 2016-10-18 20:50 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏
總結
以上是生活随笔為你收集整理的yield(C# 参考)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U3D 动态创建Prefab的多个实例
- 下一篇: U3D Debug.log的问题