Обратите внимание, что Dictionary<TKey, TValue>.ValueCollection
действительно осуществляет ICollection<TValue>
и, следовательно, также IEnumerable<TValue>
.
Причина свойство напечатал так, как это, вероятно, по соображениям производительности: поскольку методы этого класса не являются виртуальными, они могут быть точно решены в ходе JIT компиляции, вместо того, чтобы требовать виртуальные таблицы Lookups для каждого метода вызывать во время выполнения. Это эффективно удаляет один уровень косвенности из каждого метода, который вы вызываете в коллекции. (Он также дает JIT возможность встроить эти вызовы методов!)
Конечно, вы можете неявно преобразовать объект в ICollection<TValue>
, если это необходимо, поэтому здесь нет потери функциональности, просто небольшая (микро) оптимизация ,
В вашем случае нет причин, по которым вы не можете вернуть ICollection<TValue>
, но вы можете вернуть более конкретный тип, если хотите. Если вы это сделаете, то вам придется явно реализовать свойство интерфейса IDictionary<TKey, TValue>.Values
удовлетворить интерфейс:
private ValueCollection valueCollection;
public ValueCollection Values
{
get { return valueCollection; }
}
ICollection<TValue> IDictionary<TKey, TValue>.Values
{
get { return valueCollection; }
}
Это правильно подразумевает, что любой выигрыш в производительности будет дан только для потребителей класса, если они используют ссылку набранную как ваш тип коллекции; не будет никакого преимущества в производительности, если они возьмут ссылку на IDictionary<TKey, TValue>
, так как им придётся выбирать, но чтобы получить доступ к вашей коллекции значений через ICollection<TValue>
в любом случае.
В моей работе я не обнаружил, что разница в производительности является достаточно значительной, чтобы гарантировать возврат чего-либо более конкретного, чем ICollection<TValue>
. Помните: всегда ориентируйтесь и никогда преждевременно не оптимизируйте.
Очень интересный вопрос :) –