Overriding an automatic property

Short Answer: Yes, the Child allocates all Base class fields, so it still has the backing field allocated. However, you can’t access it any other way than through Base.MyInt property.

Long Answer:

Quick disassembly results.

Base and Child classes implementation:

public class Base
{
    public virtual int MyInt { get; set; }
}

public class Child : Base
{
    private int anotherInt;

    public override int MyInt
    {
        get { return anotherInt; }
        set { anotherInt = value; }
    }
}

enter image description here

As you can see, the backing field exists within Base class. However, it is private, so you can’t access it from Child class:

.field private int32 '<MyInt>k__BackingField'

And your Child.MyInt property does not use that field. The property IL is:

.method public hidebysig specialname virtual 
    instance int32 get_MyInt () cil managed 
{
    // Method begins at RVA 0x2109
    // Code size 7 (0x7)
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: ldfld int32 ConsoleApplication2.Child::anotherInt
    IL_0006: ret
} // end of method Child::get_MyInt

.method public hidebysig specialname virtual 
    instance void set_MyInt (
        int32 'value'
    ) cil managed 
{
    // Method begins at RVA 0x2111
    // Code size 8 (0x8)
    .maxstack 8

    IL_0000: ldarg.0
    IL_0001: ldarg.1
    IL_0002: stfld int32 ConsoleApplication2.Child::anotherInt
    IL_0007: ret
} // end of method Child::set_MyInt

Is uses anotherInt field, as you could expect.

The only ways to access the '<MyInt>k__BackingField' (indirectly, through Base.MyInt property) are:

  • base.MyInt from within Child class

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)