如果你有对象Dictionary<k, v> myDictionary
, 然后 myDictionary.Values
将是 Dictionary<k, v>.ValueCollection
类型和 myDictionary.Keys
将是 Dictionary<k, v>.KeyCollection
类型.
我不明白为什么 myDictionary.Values
的类型不像IEnumerable<v>
, IList<v>
或其他东西。
现在,考虑到这一点,如果我创建一个自定义类型的字典; Dictionary2<k1, k2, v>
, 应该 myCustomDictionary.Values
返回 IEnumerable<v>
,或 ValueCollection 的自定义实现?更重要的是,为什么?
最佳答案
请注意 Dictionary<TKey, TValue>.ValueCollection
实际上执行 ICollection<TValue>
因此也是IEnumerable<TValue>
.
属性类型化的原因可能是出于性能原因:由于此类的方法不是虚拟的,因此可以在 JIT 编译期间准确解析它们,而不需要 vtable在运行时查找每个方法调用。这有效地从您在集合上调用的每个方法中删除了一个间接级别。 (它还为 JIT 提供了内联这些方法调用的选项!)
当然,你可以将对象隐式转换为ICollection<TValue>
如果有必要,这里不会损失任何功能,只是一些(微)优化。
在您的情况下,您没有理由不能返回 ICollection<TValue>
,但如果您愿意,可以返回更具体的类型。如果这样做,则必须显式实现接口(interface)属性 IDictionary<TKey, TValue>.Values
满足接口(interface):
private ValueCollection valueCollection;
public ValueCollection Values
{
get { return valueCollection; }
}
ICollection<TValue> IDictionary<TKey, TValue>.Values
{
get { return valueCollection; }
}
这正确地暗示了只有当类的使用者使用类型化为您的集合类型的引用时,他们才会获得任何性能优势;如果他们引用 IDictionary<TKey, TValue>
将没有性能优势,因为他们将不得不选择,只能通过 ICollection<TValue>
访问您的值(value)收藏无论如何。
在我的工作中,我没有发现性能差异大到足以保证返回比 ICollection<TValue>
更具体的任何内容。 .请记住:始终进行基准测试,切勿过早优化。
关于c# - myCustomDictionary.Values 应该返回什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16171775/