請注意,Dictionary<TKey, TValue>.ValueCollection
確實實施ICollection<TValue>
,因此也IEnumerable<TValue>
。
之所以屬性是類型它的方式很可能出於性能的考慮:因爲這個類的方法不是虛擬的,他們可以準確地JIT編譯過程中解決,而不需要虛函數表查找每個方法,在運行時調用。這有效地從您調用集合的每種方法中移除一個間接級別。 (它也給了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>
更具體的東西。記住:永遠都是基準,永遠不會過早優化。
非常有趣的問題:) – 2013-04-23 14:22:23