在结构中使用字节数组是一个坏主意吗(与使用多个基元类型相比)?

Bud*_*rot 2 c# arrays struct

我需要一个恰好有 X 字节的小数据类型。

为了存档这个我基本上有两种方法:

  • 我可以定义一个容量为 X 的 byte[] 数组
  • 我可以组合一些内置数字类型来归档我需要的字节数,fe for X = 12:
    • 我可以使用 3 个整数
    • 我可以使用 1 长和 1 短
    • 我可以使用 12 字节字段
    • 我可以 ...

我已经看到在很多结构中使用了GuidMongoDb 的 ObjectId具体字段,即使它们或多或少只是一个普通的字节数组。

public struct XY
{
    private readonly int _a;
    private readonly int _b;
    private readonly int _c;
}
Run Code Online (Sandbox Code Playgroud)

public struct XY
{
    private readonly byte[] bytes = new byte[12]; // probably set via ctor
}
Run Code Online (Sandbox Code Playgroud)

这是否提供了任何显着的好处(除了可用性之外)?

或者换句话说:在结构中使用字节数组是一个坏主意吗?

Jon*_*asH 6

普通字段最常在结构中使用的原因是它们将作为结构的一部分存储。因此,如果我有一个Guid[],那么所有数据都将存储在一个连续的内存块中。这对于数据局部性和内存使用有好处。

如果您存储数组,您的结构将仅包含单个引用,而实际数据将存储在其他地方,并且访问数据需要间接。这并不意味着您永远不应该将数组存储为结构的一部分,但如果您需要大小不同的数据或其他特殊需求,那么这是最有益的。

对于固定大小的小数据,使用单独的字段可能更好。如果您想将字段视为值序列,您始终可以实现 IEnumerable/IReadOnlyCollection/IReadOnlyList。

  • 即使使用单独的字段可能更好,我们也可以提供一个“属性”(索引器)来“查看”这些字段,就像它们在数组中一样;+1 (3认同)