2013-04-23 11 views
7

オブジェクトがDictionary<k, v> myDictionaryの場合、myDictionary.ValuesDictionary<k, v>.ValueCollectionmyDictionary.KeysDictionary<k, v>.KeyCollectionとなります。myCustomDictionary.Valuesはどのような型を返すべきですか?

myDictionary.ValuesのタイプがIEnumerable<v>,IList<v>などのようなものではないことがわかりません。

これを念頭に置いて、カスタムの種類の辞書を作成すると、 Dictionary2<k1, k2, v>myCustomDictionary.ValuesIEnumerable<v>、またはValueCollectionのカスタム実装ですか?もっと重要な理由は?

+2

非常に興味深い質問:) –

答えて

5

実際にDictionary<TKey, TValue>.ValueCollectionICollection<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>よりも具体的なものを返すことを保証するのに十分なほど重要でないことはわかりませんでした。覚えておいてください:常にベンチマークを行い、早めに最適化することはありません。

+1

何が、この答えには、多くの情報があります。ありがとうございました! – Tipx

+0

'List 'と 'Dictionary 'は 'IList 'と 'IDictionary 'の中で最も頻繁に使われる実装です。そのため、不必要なインターフェイスディスパッチコールを防止することは、.NETエコシステム全体での集約効果をもたらし、Javaが(インフラストラクチャークラスでオーバーライド可能なメソッドを過度に使用するために)触れることができないモバイルデバイスの電力優位性に貢献します。 –

1

Dictionary<k, v>.ValueCollectionIEnumerable<v>Dictionary<k, v>.KeyCollectionは、IEnumerable<k>を実装しています。返される結果が列挙できないようなものではありません。

IEnumerableとして結果を入力するのではなく、IEnumerableを実装する実際のクラスを返すことによって、少しの追加機能も組み込むことができます。たとえば、両方のコレクションにはCountというプロパティがありますが、いずれのIEnumerableでも簡単にアクセスできません。

+2

'ICollection 'はCountプロパティを持ち、 'IDictionary .Values'は' ICollection 'を返します。したがって、 'IDictionary ' *の実装は、とにかく 'Count'プロパティをサポートする' Values'オブジェクトを返す必要があります。より具体的な 'Dictionary .Values'型は、私が見ることができる余分な機能を提供するものではありません。 – cdhowie

関連する問題