[C#] Öffentliche Felder versus automatische Eigenschaften



Answers

Wenn ich die API-Probleme ignoriere, ist das Debuggen das, was ich am wertvollsten finde, wenn ich eine Eigenschaft verwende.

Der CLR-Debugger unterstützt keine Datenunterbrechungspunkte (die meisten nativen Debugger tun dies). Daher ist es nicht möglich, beim Lesen oder Schreiben eines bestimmten Feldes in einer Klasse einen Haltepunkt zu setzen. Dies ist in bestimmten Debugging-Szenarien sehr einschränkend.

Da Eigenschaften als sehr dünne Methoden implementiert werden, ist es möglich, Haltepunkte beim Lesen und Schreiben ihrer Werte zu setzen. Dies gibt ihnen ein großes Bein über Felder.

Question

Uns wird oft gesagt, dass wir die Kapselung schützen sollten, indem wir Getter- und Setter-Methoden (Eigenschaften in C #) für Klassenfelder machen, anstatt die Felder der Außenwelt auszusetzen.

Aber es gibt viele Zeiten, in denen ein Feld nur dazu da ist, einen Wert zu halten, und keine Berechnung zum Abrufen oder Festlegen erfordert. Für diese würden wir alle diese Nummer machen:

public class Book
{
    private string _title;

    public string Title
    {
          get{ return _title;  }
          set{ _title = value; }
    }
}

Nun, ich habe ein Geständnis, ich konnte es nicht ertragen, all das zu schreiben (wirklich, es musste es nicht schreiben, es musste es anschauen), also wurde ich Schurke und benutzte öffentliche Felder.

Dann kommt C # 3.0 und ich sehe, dass sie automatische Eigenschaften hinzugefügt haben:

public class Book
{
    public string Title {get; set;} 
}

das ist aufgeräumter, und ich bin dankbar dafür, aber wirklich, was ist so anders als nur ein öffentliches Feld zu machen?

public class Book
{
    public string Title;
}



Wenn Sie von einem Feld zu einer Eigenschaft wechseln, wird der Vertrag aufgelöst (z. B. muss der gesamte referenzierende Code neu kompiliert werden). Wenn Sie also einen Interaktionspunkt mit anderen Klassen haben - jedem öffentlichen (und allgemein geschützten) Mitglied, möchten Sie für zukünftiges Wachstum planen. Tun Sie dies, indem Sie immer Eigenschaften verwenden.

Es ist nichts, um es zu einer Auto-Eigenschaft heute zu machen, und 3 Monate später erkennen Sie, dass Sie es lazy-loaded machen wollen, und setzen Sie einen Null-Check in den Getter. Wenn Sie ein Feld verwendet haben, ist dies im besten Fall eine Neukompilierung und im schlimmsten Fall unmöglich, je nachdem, wer und was noch auf Ihre Assemblys angewiesen ist.




Eine Sache, die ich als sehr nützlich empfinde, sowie alle Code- und Testing-Gründe ist, dass, wenn es sich um eine Eigenschaft oder ein Feld handelt, die Visual Studio-IDE die Referenzen für eine Eigenschaft, aber kein Feld anzeigt.




Ein weiterer Vorteil von automatisch implementierten Eigenschaften gegenüber öffentlichen Feldern besteht darin, dass Sie set-Zugriffsmethoden als privat oder geschützt festlegen können und die Objektklasse, in der sie definiert wurde, besser steuern können als die öffentlichen Felder.




Es ist nichts falsch daran, ein Feld public . Aber denken Sie daran, dass das Erstellen von getter/setter mit private Feldern keine Kapselung ist. IMO, Wenn Sie andere Eigenschaften eines Property nicht interessieren, können Sie es auch public .




Links