我有一个情况,结构可能比类更可取:
- 包含 3 个 bool 值
- 是不可变的
- 从不装箱
但是,我想添加一些只有 get 访问权限的属性,它们提供了上述 3 个 bool 值的组合。例如, bool 值是“Same”、“Forward”和“Backward”。属性可以是“All”、“None”、“UniDirectional”、“BiDirectional”等等,可以从前3中确定。
这些属性是否会增加堆栈上每个结构实例的大小,从而使类更合适?还是不会影响选择?
最佳答案
简答:
不,他们没有。
长答案:
不,他们没有;但是……
属性本身只是常规方法,但采用类似字段的语法。因为方法只存在于内存中的一个位置(因为它们对于该类型的每个对象都是相同的)它们不会影响每个实例的大小。请注意,虚拟方法(包括虚拟属性)有点困惑,因为添加新的虚拟方法会增加 vtable 的大小,但是每个类的 vtable 只存在一次;但这没有实际意义,因为结构在 .NET 中没有 vtable(在 C++ 中有,但那是因为结构和类在语义上是相同的)。
“属性”可以增加结构类型的内存大小,但前提是编写它们的人不熟悉“自动属性”。 C# 3.0 引入了自动实现的属性(或简称为“自动属性”),其中编译器为普通的 getter/setter 属性创建了一个隐藏字段。语法是 public PropertyName { get;放;
。
回到主题:只有实例成员字段会影响结构的大小,除非您在使用自定义 StructLayout 时有重叠字段(这就是您在 C# 中创建 union
的方式)。请注意,静态成员不会影响实例的大小,但是在 VB 中,Static
关键字在用于局部变量时会影响实例大小(尽管是同一个词“static”,局部变量VB 中标记为 Static
的类不处于静态状态。
最后,请注意,在 .NET 中存在与值相关的开销,但这些是 .NET 的“托管”特性所固有的,但是它们不适用于互操作场景中使用的结构(即指针算法和 sizeof
都像在 C/C++ 下一样工作。
关于c# - 获取属性会影响结构的大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12065065/