在下面的三个属性中,BarProp每个类实例只需要4个字节的内存吗?
class Foo
{
int BarEmptySet { get { return 0; } set { } }
int BarNoSet { get { return 0; } }
int BarProp { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编译器仅为自动实现的属性生成支持字段(例如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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
如您所见,仅BarProp用于stfld设置支持字段并ldfld返回支持字段的值.其他人只是使用文字0.