Pamiętaj, że Dictionary<TKey, TValue>.ValueCollection
w rzeczywistości implementuje ICollection<TValue>
, a zatem także IEnumerable<TValue>
.
Powodem nieruchomość jest wpisane droga to jest prawdopodobne, ze względu na wydajność: od metody tej klasy nie są wirtualne, można je dokładnie rozwiązany podczas JIT kompilacji, zamiast konieczności vtable wyszukiwań dla każdej metody zadzwoń w czasie wykonywania. To skutecznie usuwa jeden poziom indoktrysu z każdej metody, którą wywołujesz w kolekcji. (Daje to również JIT możliwość wstawiania tych wywołań metod!)
Oczywiście można w razie potrzeby przekonwertować obiekt na ICollection<TValue>
, więc nie ma tu żadnej utraty funkcjonalności, tylko trochę (mikro) optymalizacji .
W twoim przypadku nie ma powodu, dla którego nie możesz zwrócić ICollection<TValue>
, ale możesz zwrócić bardziej szczegółowy typ, jeśli chcesz. Jeśli tak, to trzeba będzie jawnie zaimplementować właściwość interfejsu IDictionary<TKey, TValue>.Values
zaspokoić interfejs:
private ValueCollection valueCollection;
public ValueCollection Values
{
get { return valueCollection; }
}
ICollection<TValue> IDictionary<TKey, TValue>.Values
{
get { return valueCollection; }
}
To właściwie oznacza, że wszelkie korzyści wydajności będą tylko do konsumentów z klasy, jeśli są one za pomocą odniesienie wpisane jako twój typ kolekcji; nie będzie żadnej korzyści z wydajności, jeśli odwołamy się do IDictionary<TKey, TValue>
, ponieważ będą musieli wybrać, ale mimo to uzyskać dostęp do twojego zbioru wartości przez ICollection<TValue>
.
W swojej pracy nie stwierdziłem, że różnica w wydajności jest na tyle znacząca, aby zagwarantować zwrot czegoś bardziej konkretnego niż ICollection<TValue>
. Pamiętaj: zawsze sprawdzaj i nigdy przedwcześnie nie optymalizuj.
Bardzo ciekawe pytanie :) –