私が読んだことから、パフォーマンス上の理由から、特定のコレクションの列挙型を参照型ではなく変更可能な構造体にする設計上の決定が下されました。
良い質問。
まず、あなたは正しいです。一般に、可変値型はコードの悪臭を放ちますが、この場合は正当化されます。
- ミューテーションは、ユーザーからほとんど完全に隠されています。
- 誰かが列挙子を紛らわしい方法で使用する可能性はほとんどありません。
- 可変値型を使用すると、非常に一般的なシナリオで現実的なパフォーマンスの問題が実際に解決されます。
他の非常に多くのパフォーマンスが重要なコレクションが代わりに可変構造体を使用しているときに、Array の汎用イテレータが参照型として実装された理由を誰かが知っているかどうか疑問に思っています。
あなたが配列の列挙のパフォーマンスを気にするような人なら、そもそもなぜ列挙子を使うのでしょうか? これは念のための配列です。for
普通の人のようにインデックスを反復するループを書くだけで、決して列挙子を割り当てません。(またはループ。ループ コレクションが配列であることがわかっている場合foreach
、C# コンパイラはforeach
ループを同等のループに書き換えます。)for
そもそも配列から列挙子を取得する唯一の理由は、 を受け取るメソッドにそれを渡すIEnumerator<T>
場合です。値の型を作成してからボックス化する費用を負担するのはなぜですか? 最初は参照型にしてください。