3

我有一个结构可能比类更可取的情况:

  • 包含 3 个布尔值
  • 是不可变的
  • 从不装箱

但是,我想添加一些只有 get 访问权限的属性,它们提供了上述 3 个布尔值的组合。例如,布尔值是“Same”、“Forward”和“Backward”。属性将是“All”、“None”、“UniDirectional”、“BiDirectional”等等,这可以从前 3 个中确定。

这些属性会增加堆栈上每个结构实例的大小,从而使类更合适吗?还是不会影响选择?

4

1 回答 1

8

简短的回答:

不,他们没有。

长答案:

不,他们没有;但...

属性本身只是常规方法,但具有类似字段的语法。因为方法只存在于内存中的一个位置(因为它们对于该类型的每个对象都是相同的)它们不会影响每个实例的大小。请注意,虚拟方法(包括虚拟属性)有点混乱,因为添加新的虚拟方法会增加 vtable 的大小,但是每个类只存在一个 vtable;但这没有实际意义,因为结构在 .NET 中没有 vtable(在 C++ 中它们有,但这是因为结构和类在语义上是相同的)。

“属性”可以增加结构类型的内存大小,但前提是编写它们的人不熟悉“自动属性”。C# 3.0 引入了自动实现的属性(或简称为“自动属性”),其中一个隐藏字段由编译器为琐碎的 getter/setter 属性创建。语法是public PropertyName { get; set; }.

返回主题:只有实例成员字段会影响结构的大小,除非您在使用自定义 StructLayout 时有重叠的字段(这是您union在 C# 中创建 s 的方式)。请注意,静态成员不会影响实例的大小,但是在 VB 中Static,当用于局部变量时,关键字会影响实例大小(尽管同一个词,“静态”,Static在 VB 中标记的局部变量不在类 static状态)。

最后,请注意,在 .NET 中存在与值相关的开销,但这些开销是 .NET 的“托管”性质所固有的,但它们不适用于互操作场景中使用的结构(即指针算术和sizeof所有工作都可以正常工作)在 C/C++ 下)。

于 2012-08-22T01:02:38.183 回答