noti che Dictionary<TKey, TValue>.ValueCollection
fa infatti attuare ICollection<TValue>
e quindi anche IEnumerable<TValue>
.
Il motivo per cui la proprietà è digitato il modo in cui è è probabile che per motivi di prestazioni: dal momento che i metodi di questa classe non sono virtuali, possono essere esattamente risolti durante la compilazione JIT, invece di richiedere ricerche vtable per ogni metodo chiamata al runtime. Ciò rimuove efficacemente un livello di riferimento indiretto da ogni metodo che chiamate sulla raccolta. (Dà anche alla JIT la possibilità di inlineare quelle chiamate di metodo!)
Ovviamente, è possibile convertire implicitamente l'oggetto in ICollection<TValue>
se necessario, quindi non c'è alcuna perdita di funzionalità qui, solo un po 'di (micro) ottimizzazione .
Nel tuo caso, non v'è alcuna ragione per cui non si può tornare ICollection<TValue>
, ma si può restituire un tipo più specifico se si desidera. Se lo fai, allora si dovrà implementare in modo esplicito la proprietà di interfaccia IDictionary<TKey, TValue>.Values
per soddisfare l'interfaccia:
private ValueCollection valueCollection;
public ValueCollection Values
{
get { return valueCollection; }
}
ICollection<TValue> IDictionary<TKey, TValue>.Values
{
get { return valueCollection; }
}
Ciò implica correttamente che qualsiasi miglioramento delle prestazioni sarà dato solo ai consumatori della classe se si utilizza un riferimento digitato come tipo di raccolta; non ci sarà alcun vantaggio in termini di prestazioni se prenderanno un riferimento a IDictionary<TKey, TValue>
, in quanto dovranno scegliere comunque di accedere alla propria collezione di valori tramite ICollection<TValue>
.
Nel mio lavoro, non ho trovato la differenza di prestazioni sufficientemente significativa da giustificare la restituzione di qualcosa di più specifico di ICollection<TValue>
. Ricorda: sempre punto di riferimento, e mai prematuramente ottimizzare.
Domanda molto interessante :) –