3

インターフェイスには、、、などのプロパティIList<T>でサポートされていない操作に加えて、インデックスによるアクセスが含まれます。SortedList<TKey, TValue>.KeysAddRemoveInsert

ReadOnlyCollection<T>戻り値などのList<T>.AsReadOnlyは実装されIList<T>ているため、インデックスによるアクセスを提供しますが、 などの不正な操作をAdd明示的に実装することで隠します。さらに、これは基になるリストの単なるラッパーです。そのため、コピーは作成されないため、実際のパフォーマンスに影響を与えることはありません (私はそう思います)。

なぜSortedList<TKey, TValue.KeysではないのReadOnlyCollection<TKey>ですか?(さらに言えば、Valuesプロパティが ではないのはなぜReadOnlyColllection<TValue>ですか?)

4

1 に答える 1

3

これはかなりあいまいですが、これは最適化だと思います。これは、ジェネリックスの実装方法と関係があります。ジェネリッククラスメソッドのマシンコードは、実行時にJITコンパイラによって作成されます。それはそれのいくつかの具体的なバージョンを作る必要があります。任意の参照型に1つあります。また、プログラムで使用される値型引数ごとに1つずつ。

これは非効率的であり、生成する必要のあるコードが大量に発生する可能性があります。ジェネリックフレームワーククラスには特に悪いですが、それらはNgen-edです。具体的なメソッドの実装は、JITでコンパイルする必要があり、Ngenイメージに含めることはできません。

これに対抗するために、フレームワークにプライベートコードがあり(申し訳ありませんが、どこを忘れたか)、ジェネリッククラスのさまざまなバージョンのラフト全体をインスタンス化します。興味深い何もしないコード、それはかなり長い間私を困惑させました。ただし、副作用として、Ngen.exeが汎用クラスメソッドのコードを生成します。このようなジェネリッククラスを独自のコードで使用する場合は、Ngenイメージからメソッドの具体的な実装を取得します。JITコンパイラは必要ありません。

それがどこにつながるかを見ることができます。System.Collections.ObjectModel.ReadOnlyCollectionは、おそらくこのリストに含めるにはあまりにも曖昧であると見なされていました。簡単に検証できます。メソッドが1つにステップインすると、参照ソース.pdbsを取得した場合でも、ソースコードにステップインしないことがわかります。

これが正確な説明であるかどうかは100%わかりません。しかし、靴は合います。

于 2010-03-03T18:02:21.380 に答える