[解決済み】C#のyieldキーワードは何に使われるのか?
2022-03-23 14:09:07
質問
で IListの一部分のみを公開するにはどうしたらいいですか? の質問で、回答の1つに以下のコードスニペットがありました。
IEnumerable<object> FilteredList()
{
foreach(object item in FullList)
{
if(IsItemInPartialList(item))
yield return item;
}
}
yieldキーワードはそこで何をするのでしょうか? いくつかの場所で言及されているのを見たし、他の質問でも見たのですが、実際に何をするのかがよくわかりません。 私は、あるスレッドが別のスレッドに降伏するという意味でyieldを考えるのに慣れていますが、ここではそれは関係ないように思えます。
どのように解決するのですか?
その
yield
というキーワードは、実はここで非常に大きな役割を果たします。
を実装したオブジェクトを返します。
IEnumerable<object>
インターフェイスを使用します。呼び出し側の関数が
foreach
このオブジェクトの上に乗っている関数は、それが "yields"するまで再度呼び出されます。これは
C# 2.0
. それ以前のバージョンでは
IEnumerable
と
IEnumerator
オブジェクトを使用して、このようなことを行います。
このようなコードを理解する最も簡単な方法は、例をタイプインして、いくつかのブレークポイントを設定し、何が起こるか見ることです。この例でステップを踏んでみてください。
public void Consumer()
{
foreach(int i in Integers())
{
Console.WriteLine(i.ToString());
}
}
public IEnumerable<int> Integers()
{
yield return 1;
yield return 2;
yield return 4;
yield return 8;
yield return 16;
yield return 16777216;
}
この例をステップ実行すると、最初の呼び出しが
Integers()
は以下を返します。
1
. 2回目の呼び出しでは
2
という行と
yield return 1
が再び実行されることはありません。
以下は実際の例です。
public IEnumerable<T> Read<T>(string sql, Func<IDataReader, T> make, params object[] parms)
{
using (var connection = CreateConnection())
{
using (var command = CreateCommand(CommandType.Text, sql, connection, parms))
{
command.CommandTimeout = dataBaseSettings.ReadCommandTimeout;
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
yield return make(reader);
}
}
}
}
}
関連
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み] C#で「yield break;」は何をするのか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] Python 3.3のyield from構文は、実際にはどのような用途に使われるのでしょうか。
-
[解決済み】C#のvarキーワードの使い方
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】WebResource.axdとは何ですか?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。