3

我有一种我认为将其用作结构的类型。

  • 它代表单个值
  • 它是不可变的

但问题是,它有 6 个 int 字段。

那么我应该为这种类型使用哪种解决方案?

  1. 继续使用结构?
  2. 换班?
  3. 或者将 6 个整数打包成一个 int 数组,所以它只有一个字段

编辑

具有 6 个整数字段的结构的大小为 24 字节,这对于传递来说是巨大的。struct 的推荐大小不超过 16 字节

4

7 回答 7

5

这取决于您将如何使用它?

  1. 你会分配很多还是传递很多?
  2. 它会被第 3 方代码消耗吗?在这种情况下,类通常会给您更大的灵活性。
  3. 你想要结构与类语义吗?例如,不可为空?
  4. 您是否会从该类的几个预先创建的实例中受益,这些实例可以重用于表示特殊情况?类似于 String.Empty。在这种情况下,您将从课程中受益。

仅从您在问题中提供的信息很难回答。

于 2009-01-04T07:51:00.147 回答
1

小心拳击。如果您的结构将被需要一个对象的方法所使用,它将被强制转换为一个对象,并且您将受到潜在的性能影响。

这是一个更详细地解释它的参考。

我会把它变成一门课(#2),然后你就不用担心了。

使用六个整数的数组(#3)可能会使您的代码更难阅读。每个 int 都有描述性标识符的类会好得多。

于 2009-01-04T08:13:38.353 回答
0

没有看到你的结构,很难明确地说出任何东西。但我怀疑你应该把它作为一个结构。

于 2009-01-04T07:40:13.007 回答
0

怎么样WriteOnce<int[]>

于 2009-01-04T07:44:35.200 回答
0

我建议编写一个小基准来衡量不同选项的性能,这是确定的唯一方法。你可能会对结果感到惊讶(我经常这样)。

(我假设您在这里关心的是性能。)

于 2010-06-30T19:36:03.163 回答
0

如果数据持有者将是不可变的,那么结构与类的问题很可能取决于每个实例存在的平均引用数。如果有一个 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 字节还是16,000 字节。

于 2011-10-06T16:38:50.877 回答
-1

一般来说,当存储多于两条相关数据时,我喜欢创建一个将它们绑定在一起的类。特别是如果我将它们作为一个单元传递。

于 2009-01-04T09:04:12.060 回答