実際にDictionary<TKey, TValue>.ValueCollection
はICollection<TValue>
を実装しており、したがってIEnumerable<TValue>
も実装しています。
プロパティはそれは仕方がパフォーマンス上の理由のためにそうであるを入力する理由:このクラスのメソッドは仮想ではないので、彼らは正確にJITコンパイル時に解決することができ、代わりに各メソッドのvtableの検索を必要とします実行時に呼び出します。これにより、コレクションで呼び出す各メソッドから1レベルの間接参照が効果的に削除されます。
もちろん、必要に応じてオブジェクトを暗黙的にICollection<TValue>
に変換することができます。ここで機能の損失はありません。ちょっとした(マイクロ)最適化。
あなたの場合、ICollection<TValue>
を返すことはできませんが、必要に応じてより具体的なタイプを返すことができます。これは正しく、彼らが入力された参照を使用している場合、任意のパフォーマンス上の利点は、唯一のクラスの消費者に与えられることを意味し
private ValueCollection valueCollection;
public ValueCollection Values
{
get { return valueCollection; }
}
ICollection<TValue> IDictionary<TKey, TValue>.Values
{
get { return valueCollection; }
}
:あなたが行う場合は、明示的インターフェイスを満足させるために界面特性IDictionary<TKey, TValue>.Values
を実装する必要がありますあなたのコレクションタイプとして。彼らがIDictionary<TKey, TValue>
への参照を取るなら、彼らは選択する必要がありますが、とにかくICollection<TValue>
を通してあなたの価値のコレクションにアクセスするためにパフォーマンスの利点はありません。
私の仕事では、パフォーマンスの違いがICollection<TValue>
よりも具体的なものを返すことを保証するのに十分なほど重要でないことはわかりませんでした。覚えておいてください:常にベンチマークを行い、早めに最適化することはありません。
非常に興味深い質問:) –