myCustomDictionary.Values应返回什么类型?

Tip*_*ipx 7 c# collections dictionary language-concepts

如果你有对象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的自定义工具?更重要的是,为什么?

cdh*_*wie 5

注意,Dictionary<TKey, TValue>.ValueCollection实际上确实实现ICollection<TValue>,因此也IEnumerable<TValue>.

出于性能原因输入属性的原因可能是出于性能原因:由于此类的方法不是虚拟的,因此可以在JIT编译期间精确解析它们,而不需要在运行时为每个方法调用进行vtable查找.这有效地从您在集合上调用的每个方法中删除了一个级别的间接.(它还为JIT提供了内联这些方法调用的选项!)

当然,ICollection<TValue>如果需要,您可以隐式转换对象,因此这里不会丢失任何功能,只需进行一些(微)优化.

在您的情况下,没有理由不能返回ICollection<TValue>,但如果您愿意,可以返回更具体的类型.如果这样做,那么您将必须显式实现interface属性IDictionary<TKey, TValue>.Values以满足接口:

private ValueCollection valueCollection;

public ValueCollection Values
{
    get { return valueCollection; }
}

ICollection<TValue> IDictionary<TKey, TValue>.Values
{
    get { return valueCollection; }
}
Run Code Online (Sandbox Code Playgroud)

这正确地暗示,如果使用类型为您的集合类型的引用,则只会向该类的使用者提供任何性能优势; 如果他们参考IDictionary<TKey, TValue>,将没有性能优势,因为他们必须选择,但ICollection<TValue>无论如何都要访问您的价值收集.

在我的工作中,我没有发现性能差异足以保证返回任何更具体的信息ICollection<TValue>.记住:始终是基准测试,永远不要过早优化.