Frage

Einfache Frage: Erstellt eine abstrakte Eigenschaft ein privates Backing -Bereich? Beispiel:

public abstract Name { get; set; }

Wird dies ein privates Backing -Feld schaffen? Ich möchte jede Klasse erzwingen, die diese Eigenschaft abgeleitet hat, um ihr eigenes Backing -Feld zu verwenden, nicht eines, der vom Compiler erstellt wurde.

War es hilfreich?

Lösung

Nein, es tut es nicht. Ich habe gerade mit der folgenden Klasse getestet:

public abstract class Class1
{
    public abstract string TestStringAbstract { get; set; }

    public string TestString { get; set; }
}

und zersetzte es in Reflektor. Dies war der generierte Code:

public abstract class Class1
{
    // Fields
    [CompilerGenerated]
    private string <TestString>k__BackingField;

    // Methods
    protected Class1()
    {
    }

    // Properties
    public string TestString
    {
        [CompilerGenerated]
        get
        {
            return this.<TestString>k__BackingField;
        }
        [CompilerGenerated]
        set
        {
            this.<TestString>k__BackingField = value;
        }
    }

    public abstract string TestStringAbstract { get; set; }
}

Wie Sie sehen können, wurde für die Betoneigenschaft nur ein einzelnes Backing -Feld erzeugt. Der abstrakte wurde als Definition gelassen.

Dies ist logisch sinnvoll, da die Eigenschaft von einer untergeordneten Klasse überschrieben werden muss. Es macht keinen Sinn, ein Sicherungsfeld zu erstellen, dass es keine Möglichkeit gibt, jemals zugreifen zu können (da Sie niemals auf die abstrakte Eigenschaft zugreifen können).

Andererseits a virtuell Die Eigenschaft erstellt ein Backing-Feld, und jede Klasse, die die Eigenschaft mit einem automatisch implementierten Ersatz überschreibt, erstellt ein eigenes Backing-Feld auf der Ebene dieser Klasse.

Andere Tipps

Nein. Da es sich um abstrakt handelt, muss der Klasse -Implementierer die Eigenschaft implementieren. Wenn der Implementierer dies so erklärt, ist es eine automatische Eigenschaft mit einem versteckten Mitglied, um den tatsächlichen Wert zu halten.

Es gibt einen Unterschied zwischen:

public abstract string Name { get; set; }

und

public string Name { get; set; }

Die erste Immobilienerklärung erstellt kein Hintergrund. Es schafft nur eine abstrakte Eigenschaft (eine Art Schnittstellenmethodeerklärung), die von einer nicht abstrakten Erbeklasse implementiert werden muss.

Die zweite Deklaration ist eine Auto-Property, die ein Hintergrundfeld erzeugt. Es ist eigentlich Compiler -syntaktischer Zuckerabkürzung für:

private string _name;
public string Name { get { return _name; } set { _name = value; } }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top