You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

备份数据存储选型:我的特定场景下选struct还是class更合适?

关于struct与class选型的疑问

我需要一个简单的数据结构来存储四种数据类型:ImageSource、Brush、string以及一个枚举,因此考虑用struct而非class,代码如下:

public struct myData
{
    public myData(ImageSource myImg, Brush myBrush, string myText, myEnum e)
    {
        MyImage = myImg;
        MyBrush = myBrush;
        MyText  = myText;
        MyEnum  = e;
    }

    public ImageSource MyImage { get; }
    public Brush       MyBrush { get; }
    public string      MyText  { get; }
    public myEnum      MyEnum  { get; }
}

这个struct仅作为类的私有成员,用于存储最近接收的数据,并在特定场景下进行恢复。我已查阅微软关于struct与class选型的官方指南,指南指出:

CONSIDER defining a struct instead of a class if instances of the type
are small and commonly short-lived or are commonly embedded in other
objects.

AVOID defining a struct unless the type has all of the following
characteristics:

  • It logically represents a single value, similar to primitive types (int, double, etc.).
  • It has an instance size under 16 bytes.
  • It is immutable.
  • It will not have to be boxed frequently.

In all other cases, you should define your types as classes.

但我仍对自身场景的选型存在疑问,请问在此场景下,选择struct还是class更为合适?


选型分析建议

对照微软给出的四个核心条件逐一分析你的场景:

  • 是否逻辑上代表单一值:你的myData是把四个相关数据打包成一组"状态快照",属于复合数据集合,而非int、double这类单一原始值。这一点不符合struct的推荐特征。
  • 实例大小是否低于16字节:ImageSource、Brush都是引用类型,64位系统下每个引用占8字节,加上string(8字节)和枚举(对齐后8字节),总大小达32字节,远超过16字节的阈值,直接踩了struct的避坑红线。
  • 是否不可变:你的代码中所有属性都是只读的,满足不可变要求,这是符合struct条件的一点。
  • 是否不会频繁装箱:虽然当前是类的私有成员,但后续如果需要将它作为方法参数传递、存入泛型集合,或者赋值给object类型变量,都会触发装箱操作;不过这一点在你的场景中可能不是高频操作,但前两点的不符合项已经足够关键。

结合你的使用场景:作为类的私有成员存储最近数据,用class更稳妥。class是引用类型,赋值和传递时仅操作引用,开销更低;而你的struct实例大小超标,值类型的拷贝反而会带来额外性能损耗。另外从语义上,class更适合表示这种复合的、有独立意义的数据集合,而非struct强调的"单一值"。

总结下来,建议你改用class,只需把代码里的struct改成class,其他逻辑完全不用调整,既符合微软选型指南,也更适配你的实际使用场景。

内容的提问来源于stack exchange,提问作者Willy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:35:21