2012-08-22 49 views
2

我有其中一个结构可能是优选的一类的情况下:获取属性是否会影响结构的大小?

  • 含有3级的bool
  • 是不可改变
  • 从不盒装

然而,我想添加一个只有获得访问权限的属性数量,它提供了上述3个布尔的组合。例如,bools是“相同”,“前进”和“后退”。属性应该是“全部”,“无”,“单向”,“双向”等等,这可以从前者确定3.

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

回答

6

简短回答:

不,他们没有。

长答案:

不,他们不;但...

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

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

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

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

+1

我认为应该修改措辞以包含“自动属性”(以及它们如何创建/导致隐式成员......这不适用于此问题,但会抛光此回应)。 – 2012-08-22 01:23:43

+0

纠正我,如果我错了,但编译器不会生成一个完整的属性与支持字段的自动属性,这将增加结构的大小? –

+0

谢谢!我认为是这样,但这有助于解决任何疑问。 –

相关问题