获取属性会影响结构的大小吗?

Ste*_*Kok 3 c# size struct get properties

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

  • 包含3个bools
  • 是不可改变的
  • 从来没有盒装

但是,我想添加一些只有get访问权限的属性,它们提供了上述3个bool的组合.例如,bools是"Same","Forward"和"Backward".属性将是"全部","无","单向","双向"等,这可以从前者3确定.

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

Dai*_*Dai 8

简短回答:

不,他们没有.

答案很长:

不,他们没有; 但...

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

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

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

最后请注意,在.NET中存在与值相关的开销,但这些是.NET的"托管"特性所固有的,但是它们不适用于互操作场景中使用的结构(即指针算法和sizeof所有工作,因为它们会在C/C++下).