使用したIEnumerable<T>の廃棄を考慮する必要がありますか?
2023-10-10 19:22:42
質問
最近指摘されたのですが、様々なLinq拡張メソッド(例えば
Where
,
Select
など) は
IEnumerable<T>
であり、かつ
IDisposable
. 次のように評価されます。
True
new int[2] {0,1}.Select(x => x*2) is IDisposable
の結果を廃棄する必要があるのでしょうか?
Where
式の結果を処分する必要がありますか?
を返すメソッドを呼び出すと、必ず
IEnumerable<T>
を返すメソッドを呼び出すたびに、それを使い終わったときに dispose を呼び出す責任を(潜在的に)引き受けることになるのでしょうか?
どのように解決するのですか?
いいえ、ご心配には及びません。
を返すということは
IDisposable
Microsoft の C# コンパイラの実装では、イテレータブロックがたまたま
シングル
型の両方を実装しているためです。
IEnumerable<T>
と
IEnumerator<T>
. 後者は
IDisposable
を拡張しているため、このように表示されます。
デモのためのサンプルコードです。
using System;
using System.Collections.Generic;
public class Test
{
static void Main()
{
IEnumerable<int> foo = Foo();
Console.WriteLine(foo is IDisposable); // Prints True
}
static IEnumerable<int> Foo()
{
yield break;
}
}
注意点として
する
が必要であることに注意してください。
IEnumerator<T>
が実装している
IDisposable
. ですから、明示的に反復処理するときはいつでも、適切に廃棄する必要があります。例えば、何かに対して反復処理を行いたい場合、常に
a
の値を持つようにしたい場合、次のようなものを使うかもしれません。
using (var enumerator = enumerable.GetEnumerator())
{
if (!enumerator.MoveNext())
{
throw // some kind of exception;
}
var value = enumerator.Current;
while (enumerator.MoveNext())
{
// Do something with value and enumerator.Current
}
}
(A
foreach
ループはもちろんこれを自動的に行います)。
関連
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] IEnumerable<T> と IQueryable<T> を比較する。
-
[解決済み] IList<string> または IEnumerable<string> からカンマ区切りリストを作成する。
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み] IEnumerable<T>のforeachのLINQでの等価性
-
[解決済み] IEnumerable<T> / IQueryable<T>の動的なLINQ OrderBy
-
[解決済み] 空のIEnumerableを返すにはどうしたらいいですか?
-
[解決済み】IEnumerable<T>コレクションにアイテムを追加するにはどうすればよいですか?
-
[解決済み】IEnumerable vs List - What to Use? どのように動作するのでしょうか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] [Solved] 不正な文字列値: '\xEFxBFxBD' for column
-
[解決済み】"指定されたパスのフォーマットはサポートされていません。"
-
[解決済み] 2つのリストを結合する
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] IEnumerableがヌルまたは空であるかどうかを確認するには?