C# yield關鍵字

来源:https://www.cnblogs.com/dwBurning/archive/2019/10/13/yield.html
-Advertisement-
Play Games

關於yield關鍵字,網上有很多文章介紹了,但是看了之後,雖然明白了"哦,原來是這麼回事",但是在日常開發中並沒有真正的用起來,所以,寫此一篇,介紹一下在真正的項目中怎麼使用這個關鍵字。 開始我的正文介紹之前,可以先看一下微軟的官方文檔是怎麼介紹yield關鍵字的,傳送門:https://docs. ...


關於yield關鍵字,網上有很多文章介紹了,但是看了之後,雖然明白了"哦,原來是這麼回事",但是在日常開發中並沒有真正的用起來,所以,寫此一篇,介紹一下在真正的項目中怎麼使用這個關鍵字。

開始我的正文介紹之前,可以先看一下微軟的官方文檔是怎麼介紹yield關鍵字的,傳送門:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/yield

在這裡我新建了一個控制台程式,用於輸出斐波那契數列,代碼如下:我們直接在Main方法中輸出斐波那契數列,這個也沒有什麼問題,很完美,但是考慮到實際開發中不可能把所有的處理都寫在程式入口,所以我們考慮對這段代碼封裝一個方法V1

static void Main(string[] args)
{int a = 0, b = 1, c = 0;
    for (int i = 0; i < 10; i++)
    {
        Console.WriteLine("{0}", b);
        c = a + b;
        a = b;
        b = c;
    }

    //V1(10);

    //foreach (var i in V2(10))
    //{
    //    Console.WriteLine(i);
    //}

    //foreach (var i in V3(10))
    //{
    //    Console.WriteLine(i);
    //}

    Console.ReadKey();
}

方法V1代碼如下:與Main方法中的代碼段是一模一樣的,那麼有經驗的同學肯定會想,既然已經封裝了方法,那麼方法的輸出應該封裝成返回值,返回給Main方法,然後再輸出到控制台,於是我們再次修改,封裝成方法V2

private static void V1(int number)
{
    Console.WriteLine("V1");
    int a = 0, b = 1, c = 0;
    for (int i = 0; i < number; i++)
    {
        Console.WriteLine("{0}", b);
        c = a + b;
        a = b;
        b = c;
    }
}

方法V2代碼如下:方法V2中創建了一個List<int>的列表,用來接收方法返回的結果,然後在Main方法中輸出。那麼這裡有什麼問題呢?問題就是如果迴圈的基數很大,那麼,我們的List中的item就很大,占用記憶體也會隨之增加,於是,我們在此基礎上再次改造成方法V3

private static IEnumerable<int> V2(int number)
{
    Console.WriteLine("V2");
    List<int> vs = new List<int>();
    int a = 0, b = 1, c = 0;
    for (int i = 0; i < number; i++)
    {
        vs.Add(b);
        c = a + b;
        a = b;
        b = c;
    }
    return vs;
}

方法V3代碼如下:這裡便用到了關鍵字yield,正如官方文檔中所述,迭代器方法運行到 yield return 語句時,會返回一個 expression,並保留當前在代碼中的位置。 下次調用迭代器函數時,將從該位置重新開始執行。這樣的話,記憶體不會隨著基數的增加而增加,而效果卻是一模一樣的。

private static IEnumerable<int> V3(int number)
{
    Console.WriteLine("V3");
    int a = 0, b = 1, c = 0;
    for (int i = 0; i < number; i++)
    {
        yield return b;
        c = a + b;
        a = b;
        b = c;
    }
}

那麼,總結經驗,在你需要返回一個繼承自IEnumerable的集合類型的時候,就可以使用這個yield關鍵字了。

最後的運行效果:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要講解Spring開發中三種不同的註入方式,以及集合數據類型的註入,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 首先看一下@FeignClient註解的源碼: 可以看出@FeignClient註解被@Target(ElementType.TYPE)修飾,表示@FeignClient註解的作用目標在介面上。 針對其常用屬性做如下歸納: String name():指定FeignClient的名稱,如果項目使用了 ...
  • 本文首發於微信公眾號:程式員喬戈里 轉載請註明:https://blog.csdn.net/WantFlyDaCheng/article/details/102538508 一、兩次的 git commit 到不是同一個遠程分支 這裡由於提交自己的代碼第一次提交到A分支,第二次提交B分支,然後報錯了 ...
  • 記錄嵌入式Linux+NetCore培訓中遇到的一些問題以及解決方法 十一放假期間發現園裡大神大石頭(NewLife團隊)開了一個嵌入式Linux+NetCore培訓,就報名參加了。更幸運的是,我剛好最後一個名額。 今天中午收到大石頭髮的快遞,立馬取回來拆開接好樹莓派的線,然後開機啟動。本人之前沒有 ...
  • 本篇博客主要解決在前後端分離項目中,後臺為前端人員提供詳細API介面說明的問題,該文主要通過在Web API項目中修改WebApi HelpPage相關代碼和添加WebApiTestClient組件實現WebAPI介面詳細說明以及介面測試。 ...
  • 兩數相加 給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。 如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。 您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 示例: 輸入:(2 -> ...
  • .net core 攔截器的使用 實例代碼:https://gitee.com/D_C_L/InterceptorTest.git 攔截器主要是將程式中的一些可以獨立出去的模塊進行攔截,比如幕等性,和身份認證服務等等,你想獨立出去的東西,ActionFilterAttribute請求攔截器他裡面幾個 ...
  • 點這裡進入ABP進階教程目錄 下載插件 打開Datatables官網(https://datatables.net/download/) 勾選Extensions/Buttons,下載插件,複製到JD.CRS.Web.Mvc\wwwroot\lib\dataTables目錄. 引入插件 打開展示層( ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...