You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:58:45