加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:44:46 所属栏目:百科 来源:网络整理
导读:如果你有对象Dictionary k,v myDictionary,则myDictionary.Values的类型为Dictionary k,v .ValueCollection和myDictionary.Keys将为Dictionary k,v .KeyCollection类型. 我不明白为什么myDictionary.Values的类型不像IEnumerable v,IList v或者是其他东西.
如果你有对象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&gt ;,myCustomDictionary.Values应该返回IEnumerable< v>,还是ValueCollection的自定义工具?更重要的是,为什么?

解决方法

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

出于性能原因输入属性的原因可能是出于性能原因:由于此类的方法不是虚拟的,因此可以在JIT编译期间精确解析它们,而不需要在运行时对每个方法调用进行vtable查找.这有效地从您在集合上调用的每个方法中删除了一个间接级别. (它还为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>更具体的东西.记住:永远都是基准测试,永远不要过早优化.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读