Beachten Sie, dass Dictionary<TKey, TValue>.ValueCollection
tatsächlich ICollection<TValue>
und damit auch IEnumerable<TValue>
implementiert.
Der Grund, warum die Eigenschaft die Art und Weise ist es aus Performance-Gründen wahrscheinlich ist, eingegeben ist: da die Methoden dieser Klasse nicht virtuell sind, können sie genau während JIT-Kompilierung aufgelöst werden, stattdessen VTable-Lookups für jede Methode zu benötigen zur Laufzeit aufrufen. Dadurch wird eine Ebene der Indirektion von jeder Methode entfernt, die Sie für die Auflistung aufrufen. (Es gibt dem JIT auch die Möglichkeit, diese Methodenaufrufe zu inline zu setzen!)
Natürlich können Sie das Objekt bei Bedarf implizit in ICollection<TValue>
konvertieren, also gibt es hier keinen Funktionsverlust, nur ein bisschen (Mikro-) Optimierung .
In Ihrem Fall gibt es keinen Grund, dass Sie ICollection<TValue>
nicht zurückgeben können, aber Sie können einen spezifischeren Typ zurückgeben, wenn Sie möchten. Wenn Sie das tun, dann müssen Sie explizit die Schnittstelle Eigenschaft implementieren IDictionary<TKey, TValue>.Values
die Schnittstelle zu erfüllen:
private ValueCollection valueCollection;
public ValueCollection Values
{
get { return valueCollection; }
}
ICollection<TValue> IDictionary<TKey, TValue>.Values
{
get { return valueCollection; }
}
Dies bedeutet, richtig, dass jeder Leistungsvorteil wird nur für den Verbraucher der Klasse gegeben werden, wenn sie eine Referenz verwenden getippt als Ihr Sammlertyp; Es wird keinen Leistungsvorteil geben, wenn sie sich auf IDictionary<TKey, TValue>
beziehen, da sie die Wahl haben, aber dennoch auf Ihre Wertesammlung über ICollection<TValue>
zuzugreifen.
In meiner Arbeit habe ich den Leistungsunterschied nicht als signifikant genug gefunden, um etwas Spezifischeres als ICollection<TValue>
zurückgeben zu können. Denken Sie daran: immer Benchmark, und niemals vorzeitig optimieren.
Sehr interessante Frage :) –