在下面的三个属性中,只有BarProp
每个类实例需要4个字节的内存吗?
class Foo
{
int BarEmptySet { get { return 0; } set { } }
int BarNoSet { get { return 0; } }
int BarProp { get; set; }
}
答案 0 :(得分:5)
编译器仅为Auto-Implemented Properties生成支持字段(例如BarProp
)。当您提供自定义get / set实现(例如BarEmptySet
和BarNoSet
)时,不会自动生成支持字段,因此它们本身不会对对象的内存占用做出贡献。
通过查看生成的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;职责 - 创建隐藏的字段,每个类占用内存。