Felder und Eigenschaften in C#: Was ist der Unterschied und was steckt unter der Haube?

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Feld und Eigenschaft in C#: Mythen, Realität und Bytecode

\n\n

Wenn Sie sich jemals gefragt haben: „What is the difference between a field and a property?“ in C#, dann sind Sie nicht allein. Dies ist eine der beliebtesten Fragen auf Stack Overflow mit tausenden von Aufrufen. Für Anfänger erscheint der Unterschied verschwommen: Beides speichert Daten. Aber unter der Haube handelt es sich um zwei völlig unterschiedliche Mechanismen. Lassen Sie uns ein für alle Mal klären, warum eine property nicht nur ein „Feld mit Getter“ ist, sondern ein mächtiges Werkzeug für Kapselung und Verträge.

\n\n

Dieser Artikel ist keine trockene Dokumentation. Es ist eine lebendige Analyse mit Beispielen, die Sie sofort ausführen können. Schnallen Sie sich an, es wird interessant.

\n\n
\n\n

Was ist ein Feld (field) in C#?

\n\n

Ein Feld ist eine Variable, die direkt innerhalb einer Klasse oder Struktur deklariert wird. Es speichert Daten und hat keine zusätzliche Logik beim Lesen oder Schreiben. Ein Feld ist ein „roher“ Speicher.

\n\n
public class Person\n{\n    public string Name; // Dies ist ein Feld\n}
\n\n

Ganz einfach. Aber es gibt einen Haken: Wenn das Feld öffentlich ist, verlieren Sie die Kontrolle darüber, wie darauf zugegriffen wird. Jeder externe Code kann beliebige Werte hineinschreiben, und Sie können nicht darauf reagieren (z. B. die Länge der Zeichenkette prüfen oder ein Ereignis auslösen).

\n\n

Probleme öffentlicher Felder

\n
    \n
  • Keine Kontrolle über die Validierung.
  • \n
  • Das Verhalten beim Lesen/Schreiben kann nicht geändert werden, ohne die API der Klasse zu ändern.
  • \n
  • Schwieriger, Abwärtskompatibilität zu wahren.
  • \n
\n\n

Aus diesem Grund sind öffentliche Felder in guter OOP fast immer ein Antipattern. In C# wurden dafür Eigenschaften entwickelt.

\n\n
\n\n

Was ist eine Eigenschaft (property) in C#?

\n\n

Eine Eigenschaft ist ein Member einer Klasse, der wie ein Feld aussieht, aber tatsächlich ein Paar von Methoden (Accessoren) ist: get und set. Genau das ist die entscheidende Antwort auf die Frage „What is the difference between a field and a property?“. Eine Eigenschaft ist syntaktischer Zucker, hinter dem sich gewöhnliche Methoden verbergen.

\n\n
public class Person\n{\n    private string _name; // Privates Feld – Backing-Feld\n\n    public string Name // Eigenschaft\n    {\n        get { return _name; }\n        set { _name = value; }\n    }\n}
\n\n

Wenn Sie person.Name = "Alice" schreiben, wandelt der C#-Compiler dies in einen Aufruf der Methode set_Name("Alice") um. Und beim Lesen in einen Aufruf von get_Name(). Sie sehen das nicht, aber es geschieht auf der Ebene des IL-Codes (Zwischensprache von .NET).

\n\n

Automatische Eigenschaften (auto-implemented properties)

\n

Zur Vereinfachung wurden in C# 3.0 automatische Eigenschaften eingeführt. Der Compiler erstellt selbst ein privates Backing-Feld. Der Code wird kürzer, die Funktionalität bleibt dieselbe.

\n\n
public class Person\n{\n    public string Name { get; set; } // Automatische Eigenschaft\n}
\n\n

Auf IL-Ebene wird dies dennoch in die Methoden get_Name und set_Name mit einem privaten Feld umgewandelt. Keine Magie – nur Bequemlichkeit.

\n\n
\n\n

Wesentliche Unterschiede zwischen Feld und Eigenschaft: Tabelle

\n\n

Um es zu festigen, hier ein anschaulicher Vergleich. Dies hilft Ihnen, die Frage „field vs property C#“ in einem Vorstellungsgespräch oder in einem echten Projekt schnell zu beantworten.

\n\n
    \n
  • Kapselung: Feld – nur eine Variable. Eigenschaft – Zugriffsmethoden, die Logik enthalten können.
  • \n
  • Validierung: In einer Eigenschaft kann im Setter eine Prüfung hinzugefügt werden. Bei einem Feld nicht.
  • \n
  • Benachrichtigungen: In einer Eigenschaft kann leicht ein Ereignis ausgelöst werden (z. B. INotifyPropertyChanged). Bei einem Feld wäre ein Refactoring erforderlich.
  • \n
  • Virtualität: Eigenschaften können virtuell, abstrakt sein und überschrieben werden. Felder nicht.
  • \n
  • Threading: In eine Eigenschaft kann eine Sperre (lock) eingefügt werden. Bei einem Feld nur über externe Mittel.
  • \n
  • Serialisierung: Serialisierer arbeiten oft mit Eigenschaften, nicht mit Feldern (insbesondere wenn

Blogs

Buchempfehlungen