この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 26370|答える: 0

[出典] C# yieldキーワードの使用

[リンクをコピー]
掲載地 2019/05/29 9:55:11 | | | |
1. yield によって実装される関数

利回りリターン:

次のコードを見てみよう。これはforeachからyield returnまでの配列を走査する関数を実装しており、yield returnが反復者の関数も実装するために使われていることを示している。

利ードブレイク:

以下のコードを見ると、出力されるのは1と2のみで、3は出力されず、イテレータはyield breakで停止されたため、yield breakで反復終了が用いられています。

2. メソッド<T><T>、演算子、IEnumerable、IEnumerator、またはIEnumeratorを返す必要があるアクセスノードでのみ使用可能です。

3. yieldキーワードの実装原理

foreachループをwhileループに置き換え、GetEnumerator()や対応するIEnumeratorのMoveNext()、Currentプロパティは実装していませんが、これらの関数は扱い続けました。

なぜそうなるのかというと、ILSpyを使って生成されたexeを逆コンパイルして原因を探ることができます。

C#への直接デコンパイルは元のままになります



そのため、C#注釈付きでILコードにデコンパイルすることにしました。可読性は低いものの、原理は詳細に理解できます。
まずプログラムの翻訳を見てみましょう。コンパイル中に新しいクラスが自動的に生成されます。



コードを詳しく見てみると、EnumerableFuc()はこの新しいクラスを返します。



このコードが自動的に生成するクラスの実装を見ると、IEnumerable<T>、IEnumerable、IEnumerator、またはIEnumeratorを継承していることがわかります。この<T>新しいクラスが対応するIEnumeratorのMoveNext()やCurrentプロパティを実装しない理由だと推測できますが、これらの関数は通常通り使えます。



このクラスがどのように反復されるかを見ていきましょう。主にMoveNext()関数を見ていきます





MoveNext() 関数への呼び出しは各状態で1を加え、合計4回の反復が行われます。最初の3回はtrue、最後の3回はfalseを返します。これは反復の終了を意味します。 これら4つの反復は、enumberableFuc()の文に対応し、4つの部分に分割されて3の返却文に分かれています。

enumberableFuc() を用いた反復の実際の過程は次の通りです:

1. enumberableFuc() 関数を実行し、コードによって自動的に生成されるクラスのインスタンスを取得します。
2. 次にGetEnumberator()関数を呼び出し、取得したクラス自体をイテレータとして反復し始めます。
3. MoveNext( を実行するたびに状態が1増加し、switch文によりMoveNext()を呼び出すたびにコードの異なる部分を実行できます。
4。 MoveNext() は false を返し、終了します。
これにより、yieldキーワードは実際には構文的なシュガーであり、最終的にはIEnumberable<T>、IEnumberable、<T>IEnumberator、IEnumberatorの各インターフェースを実装して実装された反復関数であることも示されています。





先の:. .NETのレジリエンスおよび一時的故障対応 Pollyの再試行戦略
次に:HttpResultはクッキーの代わりにセットクッキーを受け取ります
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com