c# - 为什么 C# 对内部 KeyValuePairs 使用结构而不是类

标签 c# .net class struct equality

我的印象是结构应该用于:

  • 短暂的值(通常在整个对象生命周期内都存在)
  • 大小在 16 字节以下(通常是字符串键,很容易超过这样的大小

此外,这些不是堆分配的吗,因为您显然不能将所有这些大键值节点存储在堆栈上?甚至可能会有一些装箱费用。

我问的原因是因为我也在实现一个使用类似结构的数据结构,我注意到使用类而不是结构可以提高很多速度,并且想知道微软这样做的理由是什么,除了不变性.

但即便如此,当发生这种情况时,只返回一个复制的 KeyValueNode 可能会更快,不是吗?

来源:http://referencesource.microsoft.com/#mscorlib/system/collections/generic/keyvaluepair.cs,8585965bb176a426

最佳答案

创建一个足够小且不会杀死堆栈的任意大小的结构将总是比创建一个相同大小的类对象成本更低。将任何大小的结构传递给需要引用类型的方法将总是比传递堆对象引用更昂贵。访问保存在数组中的结构成员通常比访问保存在数组中的引用标识的类对象的成员更便宜。复制大型结构比复制小型结构或堆对象引用更昂贵,但除非结构被复制两次以上,否则此类复制的成本不会超过与创建该大小的类对象相关的额外成本;除非一个对象真的很大,否则在额外的复制成本超过类对象构造开销的节省之前,它需要被复制很多次。

如果 Dictionary 维护一个引用键值对对象的数组,让它的枚举器返回对该数组中项目的引用的成本将略低于让它返回的成本包含键值对结构的数组中项目的副本。此外,当字典扩展时,复制对键值对象的引用的成本将略低于复制键值对结构的成本。然而,将项目添加到字典的一般成本会增加,从中检索值(与键值对相反)的成本也会增加。对于字典的大多数常见用例,使用键值对对象最终会比使用结构更昂贵。

关于c# - 为什么 C# 对内部 KeyValuePairs 使用结构而不是类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29262925/

相关文章:

c# - WCF Soap 客户端无法解析签名中的 URI 以计算摘要

c# - 如何使用 log4net 进行 TDD?

asp.net - 无法加载文件或程序集 'DotNetOpenAuth.AspNet' 或其依赖项之一

.NET MVC 购物车

javascript - 当修改一个类的一个实例的属性时,该类的所有实例的属性都会改变

c++ - 为什么要使用 const 成员函数?

c# - 如何为 Direct2D 提供不同的呈现目标?

c# - 使用平方根查找素数

.net - WPF - 编译错误 : Tags of type 'PropertyArrayStart' are not supported in template sections

c++ - 具有条件类型名的模板类