IEnumerator<T> は IDisposable を継承しているのに、非ジェネリックの IEnumerator は継承していないのはなぜですか?
質問
私は、一般的な
IEnumerator<T>
は IDisposable を継承しますが、非ジェネリックなインターフェースである IEnumerator はそうではありません。なぜこのような設計になっているのでしょうか?
通常、foreachステートメントで
IEnumerator<T>
インスタンスを通過させます。生成されたforeachのコードにはtry-finallyブロックがあり、finallyの中でDispose()を呼び出します。
どのように解決するのか?
基本的にそれは見落としでした。C# 1.0 では
foreach
は決して
という
Dispose
1
. C# 1.2 (VS2003 で導入されました。奇妙なことに 1.1 はありません) では
foreach
でチェックするようになりました。
finally
ブロックの中で、イテレータが
IDisposable
- を実装しているかどうかに関わらず、そのようにする必要がありました。
IEnumerator
を拡張する
IDisposable
の実装を壊してしまうことになります。
IEnumerator
. もし彼らが、それが
foreach
がイテレータを破棄するのに有用であることが分かっていれば、きっと
IEnumerator
を拡張したのでしょう。
IDisposable
.
しかし、C# 2.0 と .NET 2.0 が登場したとき、新しいインターフェイス、新しい継承という新鮮な機会が訪れました。インターフェイスが拡張する方がはるかに理にかなっています。
IDisposable
を拡張する方がはるかに理にかなっており、最終ブロックでの実行時チェックが不要になります。また、コンパイラは、イテレータが
IEnumerator<T>
であれば、無条件に
Dispose
.
EDIT: これは信じられないほど便利です。
Dispose
が反復処理の終了時に呼び出されるのは非常に便利です(どのように終了しようとも)。これは、イテレータがリソースを保持できることを意味し、これにより、たとえば、ファイルを 1 行ずつ読み取ることが可能になります。イテレータブロックは
Dispose
の実装を生成し、すべての
finally
ブロックは、イテレータが破棄されたときに実行されます。したがって、イテレータ内で通常のコードを書くことができ、クリーンアップは適切に行われます。
1
1.0 仕様を振り返ってみると、すでに指定されていました。1.0 の実装では
Dispose
.
関連
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] なぜC#は汎用属性型を禁止しているのですか?
-
[解決済み] 一般的なリストを繰り返しながら、そのリストから要素を削除するには?
-
[解決済み] C#のFinalize/Disposeメソッドの使用について
-
[解決済み] C#4 インターフェースで定義されたオプションパラメータは、なぜ実装クラスで強制されないのですか?
-
[解決済み】HttpClientとHttpClientHandlerはリクエストの間にディスポされなければならないのでしょうか?
最新
-
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#で四捨五入する方法
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】URLから画像をダウンロードする方法
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】「namespace」なのに「type」のように使われる。