ホームページ  >  記事  >  バックエンド開発  >  C# の Yield キーワード

C# の Yield キーワード

王林
王林オリジナル
2024-09-03 15:26:44295ブラウズ

Yield は、C# のコンテキスト キーワードです。コンテキスト キーワードは、完全なプログラム用に予約されていない C# のキーワードです。むしろ、これらは、キーワードを適切に使用できるプログラムの特定の部分用に予約されたキーワードです。これらのキーワードは、その関連性がコンパイラに特別な意味を伝えない限り、有効な識別子として使用できます。

yield キーワードは、キーワードを含むメソッドまたはアクセサーがイテレータ メソッド/アクセサーであることを示します。イテレータ メソッド/アクセサは、単一の値を返さないメソッド/アクセサです。むしろ、反復で呼び出され、反復ごとに異なる値を返します。

構文

yield キーワードの構文は非常に単純です。メソッドまたはアクセサーの return ステートメントの前にキーワードを指定するだけです。

yield return <expression>;

または

yield break;

これらはキーワードの 2 つの実装です。 return ステートメントで使用すると、yield キーワードは、式の終了条件が満たされるまで、式から計算された次の値を返します。 Break キーワードと一緒に使用すると、yield キーワードは反復を中断し、プログラムの実行がメソッド/アクセサーから行われます。

C# では Yield キーワードはどのように機能しますか?

  1. では、C# ではキーワード ワードはどのように機能するのでしょうか? C# コンパイラにおけるキーワードの内部実装は何ですか?理解しましょう。 yield キーワードを含むメソッドは、foreach や LINQ クエリなどの反復子ループで使用できます。ループの各反復でメソッドが呼び出されます。メソッド内のコードは、yield return ステートメントまたは yield Break ステートメントが検出されるまで実行されます。
  2. メソッド内の実行の現在の位置は保持され、次の反復は前の反復で中断したところから継続されます。
  3. これは簡単でしたね。同じものを技術的に実装してみましょう。 yield キーワードを含むメソッドは、常に IEnumerable または IEnumerator を返す必要があります。コンパイラは、yield キーワードを検出すると、そのメソッドがイテレータによって消費されることを認識します。メソッドが呼び出されるとき、コンパイラは通常のようにメソッド本体を実行しません。
  4. むしろ、メソッド本体を実行し、コンパイルされた IEnumerable のセットを使用する反復子変数に返します。メソッドを呼び出すたびに、コンパイラは yield ステートメントを探し、そのステートメントで実行を一時停止します。ループの次の反復では、最後に一時停止した位置から実行が継続されます。これは、ループの終了条件または yield Break ステートメントまで続きます。各反復後に状態情報を保存するために、コンパイラーはステート マシンを作成します。

C# の Yield キーワードの例

いくつかの例を考えてみましょう:

例 #1 – メソッド

以下の例では、yield キーワードを使用してフィボナッチ数列を生成します。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
foreach (int ele in GetFibonacciSeries(10))
{
Console.Write(ele + "\t");
}
}
public static IEnumerable<int> GetFibonacciSeries(int x)
{
for (int a = 0, b = 0, c = 1; a < x; a++)
{
yield return b;
int temp = b + c;
b = c;
c = temp;
}
}
}

C# の Yield キーワード

例 #2 – アクセサ

次の例では、get アクセサーで yield キーワードを使用します。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
foreach (Day day in new Days().DaysOfWeek)
{
Console.WriteLine("Day {0} of the week is {1}", day.DayOfWeek, day.DayName);
}
}
public static IEnumerable<int> Show(int x)
{
for (int a = 0, b = 0, c = 1; a < x; a++)
{
yield return b;
int temp = b + c;
b = c;
c = temp;
}
}
public class Days
{
public IEnumerable<Day> DaysOfWeek
{
get
{
yield return new Day{DayName = "Sunday", DayOfWeek = 1};
yield return new Day{DayName = "Monday", DayOfWeek = 2};
yield return new Day{DayName = "Tuesday", DayOfWeek = 3};
yield return new Day{DayName = "Wednesday", DayOfWeek = 4};
yield return new Day{DayName = "Thursday", DayOfWeek = 5};
yield return new Day{DayName = "Friday", DayOfWeek = 6};
yield return new Day{DayName = "Saturday", DayOfWeek = 7};
}
}
}
public class Day
{
public string DayName
{ get; set; }
public int DayOfWeek
{ get; set; }
}
}

C# の Yield キーワード

例 #3 – イールドブレーク

次の例は、yield Break ステートメントの使用法を示しています。反復は、系列内の数値が見つかるか、最大検索制限に達するとすぐに終了します。

using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
int elementToFind = 21;
int maxElements = 100;
foreach (int ele in FindFibonacciNumber(elementToFind, maxElements))
{
Console.Write("Found the number " + elementToFind + " in Fibonacci series.");
}
}
public static IEnumerable<int> FindFibonacciNumber(int n, int max)
{
for (int a = 0, b = 0, c = 1; true; a++)
{
if (a > max)
{
Console.Write("Searched first " + max + " Fibonacci numbers. Element " + n + " not found");
yield break;
}
if (b == n)
{
yield return b;
yield break;
}
int temp = b + c;
b = c;
c = temp;
}
}
}

C# の Yield キーワード

elementToFind 1234 を変更すると、出力は –

になります。

C# の Yield キーワード

ルール

1) 各要素は、yield return ステートメントを使用して一度に 1 つずつ返される必要があります。
2) 戻り値の型は IEnumerable または IEnumerator である必要があります。
3) yield とともに in、ref、または out キーワードで使用することはできません。
4) Yield キーワードは、ラムダ式または匿名メソッドでは使用できません。
5) yield return ステートメントを try-catch ブロック内に置くことはできません。 try-finally ブロック内に置くことができます。
6) yield Break ステートメントを try-finally ブロック内に置くことはできません。 try-catch ブロック内に含めることができます。

メリット

yield キーワードを使用すると、一時的なコレクションを作成する必要がなくなります。データがメソッドから返される前に、データを保存するための一時コレクションを作成する必要はありません。また、メソッドの実行状態は保持されるため、コードに明示的に保存する必要はありません。

結論 – C# の Yield キーワード

この記事から、キーワードを生成する方法が C# で非常に便利なキーワードであることがわかりました。これにより、複雑な問題をできるだけ少ない行でコーディングできるようになり、コードが理解しやすくなります。これは C# の取り組みに関する上級レベルの記事でした。実践的な練習をするために、コード内でキーワードを使用してみることをお勧めします。

以上がC# の Yield キーワードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:C# ラムダ式次の記事:C# ラムダ式