日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

yield(C# 参考)

發布時間:2025/3/18 C# 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)。

迭代器方法和 get 訪問器

迭代器的聲明必須滿足以下要求:

  • 返回類型必須為 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 returnyield 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# 参考)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。