备份数据存储选型:我的特定场景下选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

