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

要将其存档,我基本上有两种方法:

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

我已经看到很多 struct 中使用了GuidMongoDb's ObjectId个具体的字段,即使它们或多或少只是一个纯字节array.

public struct XY
{
    private readonly int _a;
    private readonly int _b;
    private readonly int _c;
}

v.v.

public struct XY
{
    private readonly byte[] bytes = new byte[12]; // probably set via ctor
}

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

或者换一种说法:在 struct 中使用字节数组是个坏主意吗?

推荐答案

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

如果存储数组,则 struct 将只包含一个引用,而实际数据将存储在其他地方,访问数据需要间接.这并不意味着您永远不应该将数组存储为 struct 的一部分,但如果您需要大小不同的数据或其他一些特殊需要,它是最有用的.

对于固定大小较小的数据,使用单独的字段可能更可取.如果要将这些字段视为一系列值,则始终可以实现IEnumerable/IReadOnlyCollection/IReadOnlyList.

Csharp相关问答推荐

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

ASP.NET Core AutoMapper:如何解决错误 CS0121调用在以下方法或属性之间不明确

未在数据流块之间传播完成

为什么AggregateException的Catch块不足以处理取消?

异步任务调用程序集

为什么Azure函数(独立工作进程)索引失败?使用Azure App配置的CosmosDbTrigger绑定失败,未解析为值

如何从非异步任务中正确返回TypeResult

如何使用ODP.NET C#设置Oracle会话时间长度限制

C#命名管道-编码错误?

Visual Studio,Docker容器-容器调用:连接被拒绝

如何在单击按钮后多次异步更新标签

我什么时候不应该在Dispose中调用EgSuppressFinalize(This)?

身份验证中间件如何处理多个方案

如何使用moq和xUnit对删除操作进行单元测试?

Windows 10上埃及标准时间的时区偏移不正确

从具有泛型类型约束的类继承-Blazor

更新实体框架上的被跟踪实体

Firefox中的MudBlazor DataGrid单元格溢出

如果使用LINQ的值为空,则C#不使用GroupBy进行聚合

ASP.NET核心-UseSession()可以在UseAuthentication()和UseAuthorization()之前使用吗?