具有空setter的属性是否会占用内存空间?

时间:2017-10-14 22:17:33

标签: c#

在下面的三个属性中,只有BarProp每个类实例需要4个字节的内存吗?

class Foo
{
    int BarEmptySet { get { return 0; } set { } }
    int BarNoSet { get { return 0; } }
    int BarProp { get; set; }
}

2 个答案:

答案 0 :(得分:5)

编译器仅为Auto-Implemented Properties生成支持字段(例如BarProp)。当您提供自定义get / set实现(例如BarEmptySetBarNoSet)时,不会自动生成支持字段,因此它们本身不会对对象的内存占用做出贡献。

通过查看生成的IL

,可以轻松验证这一点

<强> BarEmptySet:

// getter
IL_0000:  nop         
IL_0001:  ldc.i4.0    
IL_0002:  stloc.0     
IL_0003:  br.s        IL_0005
IL_0005:  ldloc.0     
IL_0006:  ret         

// setter
IL_0000:  nop         
IL_0001:  ret  

<强> BarNoSet:

// getter
IL_0000:  nop         
IL_0001:  ldc.i4.0    
IL_0002:  stloc.0     
IL_0003:  br.s        IL_0005
IL_0005:  ldloc.0     
IL_0006:  ret   

// no setter is generated

<强> BarProp:

// getter
IL_0000:  ldarg.0     
IL_0001:  ldfld       UserQuery+Foo.<BarProp>k__BackingField
IL_0006:  ret         

// setter
IL_0000:  ldarg.0     
IL_0001:  ldarg.1     
IL_0002:  stfld       UserQuery+Foo.<BarProp>k__BackingField
IL_0007:  ret    

如您所见,只有BarProp使用stfld设置支持字段,ldfld使用0返回支持字段的值。其他人只使用文字jsPlumb.setContainer(document.getElementById("body")); $("#click1").click(function() { jsPlumb.connect({ source: "a1", target: "a2" }); });

答案 1 :(得分:1)

据我所知,物业实际上是&#34;糖&#34;它用两种方法包装类的字段:默认为getter和setter。

但是,它也可以描述非变量值,例如常量,函数等。因此,在您的情况下,它将仅实例化所有类实例的没有背景字段的getter / setter函数,但最后一个将执行它的默认&#34;职责 - 创建隐藏的字段,每个类占用内存。