SORU
12 AĞUSTOS 2013, PAZARTESİ


Geçersiz kılma otomatik bir özellik

bu yana

public int MyInt{ get; set;}

olur denk

private int _myInt;
public int MyInt{ get{return _myInt;} set{_myInt = value;} }

otomatik özelliği sanal yaptığınızda

public virtual int MyInt{ get; set;}

ve sonra bir alt sınıfta bu özelliği geçersiz kılar

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

bu çocuk sınıf şimdi _myİnt bu unwelcomed ve gizli ödenek var mı?

CEVAP
12 AĞUSTOS 2013, PAZARTESİ


Kısa Cevap: Evet Child Base tüm sınıf alanları ayırır, yine de yedekleme alanı tahsis etmiştir. Ancak, Base.MyInt özelliği ile daha başka bir şekilde erişebilirsiniz.

Uzun Cevap:

Hızlı demontaj sonuçları.

Base Child uygulama: sınıflar

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

Gördüğünüz gibi, yedekleme alanı Base sınıf içinde var.Ancak, özel olduğunu, bu yüzden Child sınıftan kullanamazsınız:

.field private int32 '<MyInt>k__BackingField'

Ve Child.MyInt özellik bu alanı kullanmaz. Özellik IL:

.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

Kullanır anotherInt alan, umduğun gibi.

'<MyInt>k__BackingField' erişmenin tek yolu (dolaylı olarak, Base.MyInt özelliği ile):

  • base.MyInt Child sınıf içinde

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C#

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3dmmfavs

    3dmmfavs

    29 Kasım 2009
  • chickenby

    chickenby

    2 HAZİRAN 2008
  • martin shervington

    martin sherv

    7 EKİM 2011