仅含get访问器的C#属性是否会分配内存?
关于C#属性内存分配的疑问解答
嘿,这个问题问到点子上了!刚好能帮你理清C#属性背后的编译细节,咱一步步说:
先搞懂自动属性的内存分配
public int Health { get; set; } 这玩意儿其实是C#编译器给的语法糖——说白了,编译之后它会偷偷生成两个东西:
- 一个私有值类型字段:
private int <Health>k__BackingField;(就是这个字段占了4字节内存) - 对应的
get_Health()和set_Health(int value)方法
所以你看到的自动属性,本质上是“私有字段+自动实现的存取方法”,内存分配的来源是那个自动生成的后备字段,不是属性本身。
再看自定义getter的属性
public int Health { get { return ..... } } 这种自定义getter的属性,情况就分两种:
如果你的getter里没有引用类的实例字段(比如返回常量、计算值,或者静态字段):
举个例子:public int Health { get { return 100; } }这时候编译后它就是一个单纯的
get_Health()方法,没有对应的实例后备字段,自然不会给每个类实例分配额外的4字节内存——它就是个返回int值的方法而已。如果你的getter里引用了类的实例字段:
比如:private int _health = 100; public int Health { get { return _health; } }这时候占内存的是你自己定义的
_health字段(4字节),而属性本身依然只是个调用这个字段的方法,不会额外分配内存。
总结一下
- 自动属性:因为编译器自动生成了后备字段,所以会分配对应值类型的内存(int就是4字节)。
- 自定义getter的属性:本身只是编译后的方法,不会直接分配内存;内存占用只和你在getter里用到的实例字段有关。
内容的提问来源于stack exchange,提问作者Candid Moon Max
相关产品推荐
相关产品推荐

