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

标签 c# properties struct get size

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

  • 包含 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/

相关文章:

c# - .Net 中的负载测试应该遵循哪种方式?

c# - 当类型仅在运行时已知时,如何在有限制的情况下调用泛型

.net - 如何使用 Reflexil v1.5 修改 .net 属性?

c++ - 未命名的结构可以继承吗?

c# - .Net 使用什么算法来搜索字符串中的模式?

c# - MVC Controller 的操作中的异步/等待

javascript - console.log 中的 %j 说明符不包括某些属性

c# - 在 VS2010 中声明 List<myClass> 属性时出现问题

c - C-如何使用free()释放内存中的结构?

c - Fscanf 得到的值错误