410 Stimmen

Öffentliche Felder versus automatische Eigenschaften

Oft wird uns gesagt, wir sollten die Kapselung schützen, indem wir Getter- und Setter-Methoden (Eigenschaften in C#) für Klassenfelder erstellen, anstatt die Felder der Außenwelt preiszugeben.

Aber es gibt viele Fälle, in denen ein Feld nur dazu da ist, einen Wert zu speichern, und keine Berechnungen zum Abrufen oder Setzen erfordert. In diesen Fällen würden wir alle diese Nummer verwenden:

public class Book
{
    private string _title;

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

Nun, ich muss gestehen, dass ich es nicht ertragen konnte, das alles zu schreiben (es ging nicht darum, es zu schreiben, sondern darum, es anzusehen), also bin ich abtrünnig geworden und habe öffentliche Felder verwendet.

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 was ist wirklich so anders als ein öffentliches Feld zu machen?

public class Book
{
    public string Title;
}

199voto

Michael Stum Punkte 172055

In einem zugehörige Frage Ich hatte vor einiger Zeit einen Link zu einem Beitrag in Jeffs Blog, in dem einige Unterschiede erläutert wurden.

Eigenschaften vs. öffentliche Variablen

  • Reflexion funktioniert anders auf Variablen vs. Eigenschaften, so dass, wenn Sie auf Reflexion verlassen, ist es einfacher, alle Eigenschaften zu verwenden.
  • Sie können keine Datenabbindung mit einer Variablen durchführen.
  • Das Ändern einer Variablen in eine Eigenschaft ist eine grundlegende Änderung. Zum Beispiel:

    TryGetTitle(out book.Title); // requires a variable

95voto

JaredPar Punkte 699699

Abgesehen von den API-Problemen ist das, was ich bei der Verwendung einer Eigenschaft am wertvollsten finde, die Fehlersuche.

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

Da Eigenschaften als sehr dünne Methoden implementiert sind, ist es möglich, Haltepunkte für das Lesen und Schreiben ihrer Werte zu setzen. Dadurch haben sie einen großen Vorteil gegenüber Feldern.

81voto

Rex M Punkte 138455

Der Wechsel von einem Feld zu einer Eigenschaft bricht den Vertrag (z. B. muss der gesamte referenzierende Code neu kompiliert werden). Wenn Sie also einen Interaktionspunkt mit anderen Klassen haben - ein öffentliches (und im Allgemeinen geschütztes) Mitglied -, sollten Sie für zukünftiges Wachstum planen. Dazu sollten Sie immer Eigenschaften verwenden.

Es ist nichts zu machen es eine Auto-Eigenschaft heute, und 3 Monate nach der Linie erkennen Sie wollen es faul geladen, und setzen Sie eine Null-Prüfung in der Getter. Wenn Sie ein Feld verwendet hatten, ist dies im besten Fall eine Neukompilierung und im schlimmsten Fall unmöglich, je nachdem, wer und was sonst noch auf Ihre Assemblies angewiesen ist.

70voto

MartinStettner Punkte 27921

Nur weil es niemand erwähnt hat: Man kann keine Felder auf Interfaces definieren. Wenn Sie also eine bestimmte Schnittstelle implementieren müssen, die Eigenschaften definiert, sind Auto-Eigenschaften manchmal ein wirklich nettes Feature.

59voto

Zaid Masud Punkte 12759

Ein großer Unterschied, der oft übersehen wird und in keiner anderen Antwort erwähnt wird: Übergeordnetes . Sie können Eigenschaften als virtuell deklarieren und überschreiben, während Sie dies bei öffentlichen Mitgliedsfeldern nicht tun können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X