IRONSOFTWAREHOME

C#におけるYield入門 - Yieldとは何か、どのように使うのか、どのようなときに役立つのか。

C# での Yield 入門

Tim Corey

43 分 58 秒

C#でyieldキーワードを初めて目にしたとき、戸惑うかもしれません。 具体的にはどのような仕事ですか? 従来のreturn文の代わりにyield returnを使用するのはどのような場合ですか? 完全な理解を得るために、ティム・コーリーの優れたYouTubeチュートリアルを基に、詳細な説明を順を追って説明します:"Intro to Yield in C# - What it is, how to use it, and when it is useful".

このガイドでは、ナビゲーションを容易にするためにタイムスタンプでTimのビデオの特定のポイントを参照し、yieldがデータストリーム、大規模なコレクション、遅延評価の扱い方をどのように変換するかを示す実用的な例を含みます。

C#におけるYieldキーワードの紹介

Tim氏はまず、yieldキーワードを紹介し、初めてyieldキーワードに遭遇した開発者はしばしば混乱する可能性があることを強調します。彼は、yield文によってメソッドの実行を一時停止し、その状態を維持したまま、次の呼び出しで中断したところから継続することができると説明する。 Timは、特に大規模なデータセットを扱ったり、カスタムの反復ロジックを実装したりする場合、効率的にデータを処理するためには歩留まりを理解することが重要であると強調しています。

簡単な例を設定します:クラスプログラムと静的 Void Main

気が散らないように、TimはVisual Studioで "YieldDemoApp "というシンプルなコンソールアプリケーションを作成します。

C#においてYieldが実際に行うこと

そして、ティムは理論に深く踏み込みます。 2:04では、yieldの動作について説明している:コレクション全体を一度に処理する代わりに、yield文は、親指を本に入れるように、ある場所を保持する。

この動作は、前もってすべてを計算するのではなく、必要なときにだけ値を生成する遅延実行にとって非常に重要です。 Timの説明は、イールドリターンがどのように機能するかを理解するための基礎を明確に設定します。

デモコードの作成

クラスProgramのstatic void Mainメソッドでは、Console.WriteLineを使って"アプリの開始"や"アプリの終了"のような基本的なブックエンド・メッセージを設定し、後でforeachループで作業するときに流れを明確に視覚化できるようにしている。

この最初のコード例では、UIの複雑さを伴わない、純粋に歩留まりの実装に焦点を当てています。

PersonModelクラスを作成する

デモンストレーションとして、Tim は FirstName と LastName プロパティとコンストラクタを持つ PersonModel クラスを作成します。 PersonModel オブジェクトが作成されると、どのユーザーが初期化されたかを示すメッセージが出力されます。 これは、オブジェクトが作成されるタイミングと消費されるタイミングを視覚化するのに役立ちます。

このシンプルなコード生成ステップでは、カスタム反復子を使用するための段階を設定します。

伝統的なリスト リターンで DataAccess クラスを構築する

5:06、TimはIEnumerable<PersonModel>を返すGetPeopleメソッドを持つDataAccessクラスに移る。 最初は、3 つの PersonModel インスタンスを含む List が返されます:Tim Corey、Sue Storm、Jane Smith です。

このイテレータ・メソッドは、反復を開始する前に、すべてのオブジェクトを即座にメモリにロードします。

リストによるメモリ使用のデモンストレーション

foreachループを実行した後、Timは、最初の要素が読み込まれる前に、3人すべてのユーザが作成されていることを示しています。 これは、大規模なコレクションや大規模なデータセットを扱う際の潜在的な問題、つまりメモリ使用量の多さを浮き彫りにしています。

ティム氏は、例えば1000人のユーザーがいた場合、必要なオブジェクトが数個であっても1000個のオブジェクトを作成することになり、メモリ割り当てが非効率になると説明する。

遅延実行の利回りリターンに変更する

10:01、TimはGetPeopleを修正し、一時的なコレクション(リスト)を作成する代わりにyield returnを使用するようにした。 yield return ステートメントでは、一度に 1 つの PersonModel が直接返されます。

メソッド内のこの重要なコードは、foreachで必要なときにだけ次の要素が生成される遅延評価を可能にします。

Tim はまた、メソッドの戻り値の型は IEnumerable<PersonModel> でなければならず、List を使用すると遅延実行の目的が達成されないことを明確にしています。

デバッグ:コンパイラーはどのように降伏のコードを生成するか

ティムは、ブレークポイントを使用して、プロセスを段階的に進めていきます。 彼は、最初のMoveNext呼び出しの前に、シーケンスが空であることを示している。 foreach が次の値を必要とするときにのみ、コンパイラはイテレータ・ブロックをトリガし、yield return num 行を実行して PersonModel を初期化して返します。

ティムは、コンパイラが一時停止と再開の実行を管理するために、ボンネットの下に特別なステートマシンを生成することを強調します。

利回りリターンのメリットと効率性

ティムは、収量が非常に効率的である理由を説明しています:

  • 一度に1つのレコードを取得できます。

  • 必要なイント数を制限することができます。

  • コレクション全体をメモリにロードすることは避けてください。

  • 特に大規模なファイル処理やデータストリームを扱う場合、スケーラビリティが向上します。

LINQの.Take(2)を使用することで、Timは、3つのyield return文が存在するにもかかわらず、2つのオブジェクトのみが初期化されることを示します。

実例:Yieldを使用した素数生成器

TimはGeneratorsクラス内に新しい静的IEnumerable<int> GetPrimeNumbers()メソッドを構築します。 この無限ループでは、TimはヘルパーのIsPrimeNumber(int number)関数を使用して、プライム性をチェックしています。 もしその数が素数であれば、彼は yield return number を使ってその数を返します。

この例では、無限のシーケンスを安全に処理するために収量が重要であることを示しています。

また、これらの開発者ツールの特徴や利点を説明しながら、技術的な正確さを維持する必要があります。 しかし、yieldを使用することで、遅延実行により、数字がオンデマンドで生成されることが保証されます。

Take()で素数を取得する

Timは次に、決まった数の素数のみを安全に取得する方法を示します:

var primeNumbers = Generators.GetPrimeNumbers().Take(10000);

静的 void Main 内に書かれたこのコードは、10,000 個の素数を効率的にフェッチします。

yield returnは数字を1つずつ返すため、メモリ使用量は低く抑えられます。

カスタム反復:GetEnumerator と MoveNext を使用する

Timは、手動で反復を制御する方法を説明することで、物事をさらに進めます。

彼は、var iterator = primeNumbers.GetEnumerator()を作成し、int iでforループを使用し、iterator.MoveNext()を呼び出して要素を手動で取得します。

この手動アプローチは、カスタム反復を可能にします - 必要なときだけ次の値を求め、メソッドが最後に一時停止したところから正確に再開することを示します。

よくある間違い:降伏したコレクションで ToList() を使用する

36:45でTimが警告している。.ToList()でyieldシーケンスをListに変換すると、即座に完全な評価が行われる。

無限シーケンスで .ToList() を呼び出すと、アプリがクラッシュする危険性があります。

Timは、yield returnは遅延評価のためのものであり、.ToList()を呼び出すことは、完全なメモリの実体化を強制することによって、このパターンを壊すことを強調しています。

LINQメソッドを使用する場合、Timは.ToList()を導入する場所に注意するよう勧めています。

概要: Yieldが強力なツールである理由

Tim氏は最後に、yieldキーワードは若干のオーバーヘッド(ステートマシンの保持)を追加するものの、メモリ使用量の削減と遅延評価の利点により、yieldキーワードを使用する際の強力なツールとなることを強調している:

  • 大規模データセット

  • 大容量ファイル

  • カスタムイテレータ

  • 無限シーケンス

  • データストリーム

  • 遅延処理

彼は、イールド・リターンについてより深く理解し、よくある落とし穴を避けるために、さまざまなプロジェクトでイールドを使って練習することを提案している。

Timは最後に、視聴者が実運用コードでyieldをどのように使用したかを共有するよう呼びかけます。

結論

Tim Corey 氏の video を通して、yield キーワードが C# にもたらす大きな利点を確認しました。 カスタムイテレータの作成から大規模なコレクションの効率的な管理まで、yield returnを使用することで、関数の返り値をよりスマートに、よりメモリ効率よくすることができます。 var number、var point、var reader、var connection、または大規模なデータセットを扱う場合でも、yieldをマスターすることで、C#コーディングスキルを飛躍的に向上させることができます。

yieldを使用したことがない方は、簡単な例を通して練習し、C#コンパイラ内部でyield returnがどのように機能するかを理解する絶好の機会です。 ティムの公式YouTubeチャンネルで、より多くの洞察に満ちたビデオをご覧ください。

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

無料の30日間トライアルキーをすぐに入手してください。

Your trial license will be sent to your email address

制限なし。100% ロック解除済み。クレジットカード不要。

OR
bullet_checkedクレジットカードやアカウントの作成は不要です。制限なし。100% ロック解除済み。クレジットカード不要。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried Iron Suite
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。