c# - myCustomDictionary.Values 应该返回什么类型?

标签 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 的自定义实现?更重要的是,为什么?

最佳答案

请注意 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/

相关文章:

java - 使用 Streams API 对集合中的 n 个随机不同元素执行操作

java - groupingBy 带 boolean 值,但添加自定义字符串作为键

c# - 按键排序字典然后将所有值添加到列表

python - 按数组python中的字典值排序

c# - mvvmcross 从选项卡式导航到 View 模型

c# - 从 WebView 复制到剪贴板

javascript - 使用没有ajax的javascript调用C#代码隐藏方法

c# - 从 Datetime.ToFileTime() 转换为 DateTime 对象

Java 8 Map of Collections 从集合中删除元素,如果为空则删除条目

matlab - 如何在 MATLAB 中映射值的范围