我有一种我认为用它作为结构的类型 .
它代表单一值
这是不可改变的
但问题是,它有6个int字段 .
那么我应该为这种类型使用哪种解决方案?
继续使用struct?
改为上课?
或将6个整数打包成int数组,因此它只有一个字段
EDIT
具有6个整数字段的struct的大小是24个字节,这是很难传递的 . struct的推荐大小不超过16个字节
我建议写一个小基准来衡量不同选项的性能,这是确定的唯一方法 . 你可能会对结果感到惊讶(我经常这样) .
(我假设你关注的是性能 . )
这取决于你将如何使用它?
你打算分配很多而不是传递它吗?
是否会被第三方代码消耗?在这种情况下,类通常会为您提供更大的灵活性 .
你想要结构与类的语义吗?例如,不可空?
您是否可以从此类的一些预先创建的实例中获益,这些实例可以重复使用以表示特殊情况?与String.Empty类似 . 在这种情况下,您将从课程中受益 .
很难从您在问题中提供的信息中回答 .
小心拳击 . 如果你的结构将由一个需要一个Object的方法使用,那么它将被强制转换为一个对象,你将有潜在的性能损失 .
这是reference,它更详细地解释了它 .
我会把它变成一个 class (#2)然后你就不用担心了 .
使用六个整数(#3)的数组可能会使您的代码更难阅读 . 每个int都有一个描述性标识符的类会好得多 .
如果没有看到你的结构,就很难明确地说出任何结论 . 但我怀疑你应该把它留作结构 .
WriteOnce<int[]> 怎么样?
WriteOnce<int[]>
如果数据持有者将是不可变的,那么struct-versus-class问题很可能取决于每个实例存在的平均引用数 . 如果有一个TwentyFourByteStruct [1000]数组,那么该数组将占用24,000个字节,无论每个元素是否包含不同的值,所有元素都保持相同的值,或者介于两者之间 . 如果有一个TwentyFourByteClass [1000]数组,那么该数组将占用4,000或8,000个字节(对于32/64位系统),并且创建的每个不同的TwentyFourByteClass实例将占用大约48个字节 . 如果所有数组元素碰巧都包含对同一TwentyFourByteClass对象的引用,则总数将为4,048或8,048字节 . 如果所有数组元素都持有对不同TwentyFourByteClass对象的引用,则总数将为52,000或56,000字节 .
至于运行时性能,您可以获得的最佳性能通常是通过引用传递结构 . 按值传递结构将需要复制它们,对于大于16字节的结构(.net包括16字节或更小的结构的优化)可能会变得昂贵,但是无论是1字节还是1字节,通过引用的值类型的成本都相同16,000字节 .
通常,当存储两个以上的相关数据时,我喜欢创建一个将它们绑定在一起的类 . 特别是如果我将他们作为一个单位传递 .
7 回答
我建议写一个小基准来衡量不同选项的性能,这是确定的唯一方法 . 你可能会对结果感到惊讶(我经常这样) .
(我假设你关注的是性能 . )
这取决于你将如何使用它?
你打算分配很多而不是传递它吗?
是否会被第三方代码消耗?在这种情况下,类通常会为您提供更大的灵活性 .
你想要结构与类的语义吗?例如,不可空?
您是否可以从此类的一些预先创建的实例中获益,这些实例可以重复使用以表示特殊情况?与String.Empty类似 . 在这种情况下,您将从课程中受益 .
很难从您在问题中提供的信息中回答 .
小心拳击 . 如果你的结构将由一个需要一个Object的方法使用,那么它将被强制转换为一个对象,你将有潜在的性能损失 .
这是reference,它更详细地解释了它 .
我会把它变成一个 class (#2)然后你就不用担心了 .
使用六个整数(#3)的数组可能会使您的代码更难阅读 . 每个int都有一个描述性标识符的类会好得多 .
如果没有看到你的结构,就很难明确地说出任何结论 . 但我怀疑你应该把它留作结构 .
WriteOnce<int[]>
怎么样?如果数据持有者将是不可变的,那么struct-versus-class问题很可能取决于每个实例存在的平均引用数 . 如果有一个TwentyFourByteStruct [1000]数组,那么该数组将占用24,000个字节,无论每个元素是否包含不同的值,所有元素都保持相同的值,或者介于两者之间 . 如果有一个TwentyFourByteClass [1000]数组,那么该数组将占用4,000或8,000个字节(对于32/64位系统),并且创建的每个不同的TwentyFourByteClass实例将占用大约48个字节 . 如果所有数组元素碰巧都包含对同一TwentyFourByteClass对象的引用,则总数将为4,048或8,048字节 . 如果所有数组元素都持有对不同TwentyFourByteClass对象的引用,则总数将为52,000或56,000字节 .
至于运行时性能,您可以获得的最佳性能通常是通过引用传递结构 . 按值传递结构将需要复制它们,对于大于16字节的结构(.net包括16字节或更小的结构的优化)可能会变得昂贵,但是无论是1字节还是1字节,通过引用的值类型的成本都相同16,000字节 .
通常,当存储两个以上的相关数据时,我喜欢创建一个将它们绑定在一起的类 . 特别是如果我将他们作为一个单位传递 .