更新時間:2024-12-31 09:56:10作者:佚名
我們學習知識的目的就是為什么要使用yield關鍵字,不使用可以嗎?相信會更有趣。
首先貼出正常輸出偶數集的方法。
/*
*
* 學習Yield Return 語法
* 使用兩個方法,顯示1 - 100之間的全部偶數
*
*
*/
using System;
using System.Collections.Generic;
namespace YieldReturn語法解析
{
class Program
{
static private List<int> _numArray; //用來保存1-100 這100個整數
Program() //構造函數。我們可以通過這個構造函數往待測試集合中存入1-100這100個測試數據
{
_numArray = new List<int>(); //給集合變量開始在堆內存上開內存,并且把內存首地址交給這個_numArray變量
for (int i = 1; i <= 100; i++)
{
_numArray.Add(i); //把1到100保存在集合當中方便操作
}
}
static void Main(string[] args)
{
new Program();
TestMethod();
}
//測試求1到100之間的全部偶數
static public void TestMethod()
{
foreach (var item in GetAllEvenNumber())
{
Console.WriteLine(item); //輸出偶數測試
}
}
//測試我們正常情況下拿到全部偶數的方法
static IEnumerable<int> GetAllEvenNumber()
{
List<int> result = new List<int>(); //開集合內存存偶數用
foreach (int num in _numArray)
{
if(num % 2 == 0) //判斷是不是偶數
{
//yield return num;
result.Add(num); //存入集合
}
}
//返回偶數集合變量 可能有人會覺得奇怪返回類型不是List這樣可以嗎
//這個就要回到我們的里氏替換原則了,子類是可以替換父類的,也就是當父類用
//比如我這個方法是想得到IEnumerable 類型變量,但是我給了List類型變量
//注意List 是繼承 IEnumerable 的,什么意思當我們把子類當父類使用,
//那么大才小用,因為子類很多都是繼承父親,你自身增加很多字段或者方法,這樣就不能用了。
return result;
//yield break;
}
}
}
發布使用 Yiele Return 方法輸出耦合集合
/*
*
* 學習Yield Return 語法
* 使用兩個方法,顯示1 - 100之間的全部偶數
*
*
*/
using System;
using System.Collections.Generic;
namespace YieldReturn語法解析
{
class Program
{
static private List<int> _numArray; //用來保存1-100 這100個整數
Program() //構造函數。我們可以通過這個構造函數往待測試集合中存入1-100這100個測試數據
{
_numArray = new List<int>(); //給集合變量開始在堆內存上開內存,并且把內存首地址交給這個_numArray變量
for (int i = 1; i <= 100; i++)
{
_numArray.Add(i); //把1到100保存在集合當中方便操作
}
}
static void Main(string[] args)
{
new Program();
TestMethod();
}
//測試求1到100之間的全部偶數
static public void TestMethod()
{
foreach (var item in GetAllEvenNumber())
{
Console.WriteLine(item); //輸出偶數測試
}
}
//測試我們使用Yield Return情況下拿到全部偶數的方法
static IEnumerable<int> GetAllEvenNumber()
{
foreach (int num in _numArray)
{
if(num % 2 == 0) //判斷是不是偶數
{
yield return num; //返回當前偶數
}
}
yield break; //當前集合已經遍歷完畢,我們就跳出當前函數,其實你不加也可以
//這個作用就是提前結束當前函數,就是說這個函數運行完畢了。
}
}
}
你測試過這2個代碼的結果嗎?你能正確得到所有偶數組嗎?我需要你專門測試一下。只有這樣,你才能快速進步,才能真正學會。只要觀看并練習假動作即可。
現在我們來談談它們的區別:
這才是你真正需要學習的地方
我們需要設置一個斷點
我希望您在斷點處進行調試。如果你貼的細節太多,你會發現in return是什么意思,當代碼到達Yield return num時,當前函數就會結束,num會被移交給這里。我先給你看圖片。
最后,將給出 item 變量。
然后輸出,然后執行GetAllEvenNumber()方法,與最后一個偶數相同。
我們發現這個Yield Return可以將當前函數的進程狀態切換為阻塞狀態貝語網校,然后選擇將CPU交給當前傳出進程,從而可以轉而執行調用者函數。 (補充一點知識,我們寫的程序添加到內存中并不一定是一個進程,我們會根據情況將其劃分為若干個子進程,以方便操作系統的管理以及多個進程的運行)內存中的程序以提高計算機資源的利用率)
這有一個優點。如果我們有 1,000,000 個數據,我們需要獲取內部的耦合。當我們通過這個方法得到一個耦合后in return是什么意思,它會立即顯示在控制臺上。不用等待很長時間,而是找到所有偶數并將其存儲在集合中,然后一一輸出。
這個好處是巨大的。比如我們的用戶可能只是一開始看數據,確定不是所有的值都是需要的,讀完這些之后再看剩下的,這樣數據就會感覺顯示沒有延遲。
接下來,我們斷點并調整通用函數來查找偶數。
我們發現這個循環在完成之前不會退出當前函數,也就是說,我們必須找到所有偶數。所以如果我們有很多數據。它將等待該數據,然后才能獲取該數據并將其顯示給用戶。
這就麻煩了。
所以我們得出結論:Yield Return關鍵字的作用是退出當前函數,保存當前函數執行的地方,也就是上下文。你發現上次運行的代碼不會再執行,直到下次執行這個函數。
但你一般的返回結果是,如果你在循環體內提前返回,下面調用這個函數就會從第一步重新執行。不記錄最后執行位置。