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

Roc*_*oci 1 c#

在下面的三个属性中,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)

Sae*_*ini 5

编译器仅为自动实现的属性生成支持字段(例如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  
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.