2008-10-03 6 views
3

ich die einfache Klasse automatisch implementierte properies mit:Lernen über Auto-Implementiert Eigenschaften

Public Class foo 
{ 
    public foo() { } 

    public string BarName {get; set;} 
} 

ich natürlich die Variable BarName während meiner Klasse verwenden und müssen nun Logik hinzuzufügen, wenn der Wert der Eigenschaft gesetzt ist (es Muss alles Großbuchstabe sein, gehe Figur). Bedeutet das, dass ich jetzt eine private Variable für BarName erstellen muss, z. _BarName, und ändern Sie die aktuelle BarName-Variable, die in meiner Klasse verwendet wird, in _BarName?

Public Class foo 
{ 
    public foo() {} 

    private string _BarName = ""; 
    public string BarName 
    { 
     get {return _BarName;} 
     set {_BarName = Value.ToString().ToUpper();} 
    } 
} 

Ich versuche, um sicherzustellen, verstehe ich die Auswirkungen der Verwendung automatisch implementierte Eigenschaften, und was es mit sich bringen auf dem Weg, wenn/falls ich etwas ändern müssen. Ich gehe davon aus, dass das Refactoring, wie oben gezeigt, keine breaking Änderung ist, weil die Eigenschaft grundsätzlich gleich bleibt; Es brauchte nur ein wenig Arbeit in der Klasse, um es so zu halten und die benötigte Logik hinzuzufügen.

Ein anderes Beispiel, das sinnvoller sein kann, ist, dass ich eine Methode aufrufen muss, wenn ein Setter oder Getter verwendet wird; mehr als den Wert ändern.

Dies scheint ein fairer Kompromiss aus den Zeilen und Zeilen des Codes zu Setup-Eigenschaften.

Antwort

7

Bedeutet dies, dass ich jetzt brauche für BarName

während meiner Klasse

verwendet

Ja

und ändern Sie die aktuellen BarName Variable eine private Variable erstellen

Ändern Sie den Rest des Codes in Ihrer Klasse nicht, um die neue private Variable zu verwenden iable Sie erstellen. BarName, als eine Eigenschaft, soll die private Variable (unter anderem) verbergen, um die umfassenden Änderungen zu vermeiden, die Sie für den Rest Ihres Codes in Betracht ziehen.

Ich gehe davon aus, dass das Refactoring, wie oben gezeigt, ist kein Bruch Änderung , da die Eigenschaft im Grunde ist gleich bleibt; es dauerte nur ein wenig Arbeit, um es so zu halten und fügen Sie die benötigte Logik hinzu.

Korrekt.

+0

Ah, also benutze ich selbst die Eigenschaft, um auf die Variable zuzugreifen? Kann das wirklich nicht machen, wenn es nur gelesen wird. Der Code, den ich meinte, dass geändert werden musste, ist/inside/die Klasse – Brettski

+0

In Ihrem Beispiel ist es nicht schreibgeschützt.Jetzt, da Sie es jedoch auf den Punkt bringen, antworte ich darauf, dass Sie die Eigenschaft mit {get; privates Set; } Muster, mit dem Sie aus der Klasse heraus schreiben können. – hurst

6

Sie müssen nichts ändern. Automatisch implementierte Eigenschaften sind nur syntaktischer Zucker. Der Compiler erzeugt im Hintergrund die private Variable und die Logik zum Abrufen/Setzen. Wenn Sie Ihre eigene Getter/Setter-Logik hinzufügen, verwendet der Compiler anstelle des automatisch generierten Codes Ihren Code, aber soweit sich die Benutzer dieser Eigenschaft nicht geändert haben, hat sich nichts geändert. Jeder Code, der auf Ihre Property verweist, funktioniert weiterhin.

+0

OK. Aber um dem Setter und Getter Logik zu geben, muss ich den Code ändern, wie ich es in meinem Beispiel getan habe, richtig? – Brettski

+0

Ja, es wird gut funktionieren. Der Aufruf von ToString() in einem String ist etwas überflüssig, aber es tut nichts weh. –

+0

Was ist, wenn ich eine Methode aufrufen muss, wenn ein Getter oder Setter aufgerufen wird? – Brettski

0

Sie haben Recht mit dem Refactoring und es sollte wirklich nichts brechen.

Ob Sie die Verweise innerhalb der Klasse auf den Eigenschaftsnamen tatsächlich durchgehen müssen und diese so ändern müssen, dass sie auf das private Feld verweisen, hängt davon ab, ob der interne Code für den Zugriff auf die zugrunde liegende Darstellung der Daten erforderlich ist es wurde den Verbrauchern der Klasse vorgestellt. In den meisten Fällen konnten Sie gut genug in Ruhe lassen.

In Ihrem einfachen Beispiel wäre es sinnvoll, gut genug in Ruhe zu lassen und sicherzustellen, dass kein Code innerhalb der Klasse die Konvertierung/Formatierung im Setter unterlaufen könnte.

Wenn auf der anderen Seite der Getter etwas Magie taten die interne Darstellung des Feldes in die Art und Weise Verbraucher dann vielleicht die Daten anzuzeigen benötigt zu ändern (in einigen Fällen), um den internen Code innerhalb der Klasse des zuzugreifen müßten Feld.

Sie müssten jedes Vorkommen des Zugriffs auf die Auto-Eigenschaft in der Klasse prüfen und entscheiden, ob das Feld berührt oder die Eigenschaft verwendet werden soll.

5

Wenn Sie automatische Eigenschaften verwenden, erhalten Sie keinen direkten Zugriff auf die zugrunde liegende Variable "backing", und Sie erhalten keinen Zugriff auf die tatsächliche Logik, die in der Eigenschaft Getter und Setter implementiert wird. Sie haben nur Zugriff auf die Eigenschaft (daher verwenden Sie im gesamten Code BarName).

Wenn Sie nun eine bestimmte Logik im Setter implementieren müssen, können Sie keine automatischen Eigenschaften mehr verwenden und müssen die Eigenschaft auf "altmodische" Weise implementieren.In diesem Fall müssten Sie eine eigene private Sicherungsvariable implementieren (die bevorzugte Methode, zumindest für mich, besteht darin, die private Sicherungsvariable mit dem Namen der Eigenschaft zu benennen, jedoch mit einem Anfangsbuchstaben (in diesem Fall der Sicherung) Variable würde barName genannt werden. Sie würden dann die entsprechende Logik im Getter/Setter implementieren.

In Ihrem Beispiel haben Sie Recht, dass es keine brechende Änderung ist. Diese Art von Refactoring (von automatischen Eigenschaften zu " normale "Eigenschaften sollten nie eine brechende Änderung sein, da Sie die öffentliche Schnittstelle nicht ändern (der Name oder die Zugänglichkeit der öffentlichen Eigenschaft).

0

Automatische Eigenschaften sind nur syntaktischer Zucker, der Compiler schafft tatsächlich das private Mitglied dafür , aber da es bei co erzeugt wird mpile Zeit, Sie können nicht darauf zugreifen.

Und später, wenn Sie Getter und Setter für die Eigenschaft implementieren möchten, erst dann erstellen Sie ein explizites privates Mitglied für sie und fügen Sie die Logik hinzu.

1

Verwenden Sie keine automatischen Eigenschaften, wenn Sie wissen, dass Sie dieses Objekt validieren werden. Diese Objekte können Domänenobjekte usw. sein. Wenn Sie beispielsweise eine Customer-Klasse verwenden, verwenden Sie private Variablen, da Sie den Namen, das Geburtsdatum usw. überprüfen müssen. Wenn Sie jedoch eine Rss-Klasse verwenden, können Sie die automatischen Eigenschaften verwenden da keine Validierung durchgeführt wird und die Klasse nur zum Speichern einiger Daten verwendet wird.

Verwandte Themen