我有一个结构可能比类更可取的情况:
但是,我想添加一些只有get访问权限的属性,它们提供了上述3个bool的组合。例如,bools是“Same”,“Forward”和“Backward”。属性可以是“全部”,“无”,“单向”,“双向”等,可以从前者确定。
这些属性是否会增加堆栈上每个结构实例的大小,从而使类更合适?或者它不会影响选择吗?
答案 0 :(得分:8)
简短回答:
不,他们没有。
答案很长:
不,他们没有;但...属性本身只是常规方法,但穿着类似字段的语法。因为方法只存在于内存中的一个位置(因为它们对于该类型的每个对象都是相同的),所以它们不会影响每个实例的大小。请注意,虚拟方法(包括虚拟属性)有点混乱,因为添加新的虚拟方法会增加vtable的大小,但是每个类只存在一次vtable;但这没有实际意义,因为结构体在.NET中没有vtable(在C ++中它们可以,但那是因为结构和类在语义上是相同的。)
“属性”可以增加结构类型的内存大小,但前提是编写它们的人不熟悉“自动属性”。 C#3.0引入了自动实现的属性(或简称“自动属性”),其中编译器为简单的getter / setter属性创建了一个隐藏字段。语法为public PropertyName { get; set; }
。
返回主题:只有实例成员字段会影响结构的大小,除非您在使用自定义StructLayout时有重叠字段(这是您在C#中创建union
的方式)。请注意,静态成员不会影响实例的大小,但是在VB中,Static
关键字在用于局部变量时会影响实例大小(尽管有相同的单词,“static”),本地变量标记为{{ VB中的1}}不是类静态状态。)
最后请注意,在.NET中存在与值相关的开销,但这些在.NET的“托管”特性中是固有的,但是它们不适用于互操作场景中使用的结构(即指针算法和{{ 1}}所有工作都像在C / C ++下那样工作。