Versionierung:
Ich denke, es macht keinen großen Unterschied, wenn Sie nur an der Quellkompatibilität interessiert sind.
Die Verwendung einer Eigenschaft ist aus Gründen der Binärkompatibilität besser, da Sie sie durch eine Eigenschaft mit einem Setter ersetzen können, ohne den kompilierten Code abhängig von Ihrer Bibliothek zu beschädigen.
Konvention:
Sie folgen der Konvention. In solchen Fällen, in denen die Unterschiede zwischen den beiden Möglichkeiten nach der Konvention relativ gering sind, ist dies besser. Ein Fall, in dem es zurückkommen könnte, um Sie zu beißen, ist reflexionsbasierter Code. Möglicherweise werden nur Eigenschaften und keine Felder akzeptiert, z. B. ein Eigenschafteneditor / -betrachter.
Serialisierung
Wenn Sie von Feld zu Eigenschaft wechseln, werden wahrscheinlich viele Serialisierer beschädigt. Und AFAIK XmlSerializer
serialisiert nur öffentliche Objekte und keine öffentlichen Felder.
Verwenden einer Autoproperty
Eine weitere häufige Variante ist die Verwendung einer Autoproperty mit einem privaten Setter. Dies ist zwar kurz und eine Eigenschaft, erzwingt jedoch nicht die Lesbarkeit. Also bevorzuge ich die anderen.
Das schreibgeschützte Feld ist selbstdokumentierend. Das Feld hat
jedoch einen Vorteil:
Auf einen Blick auf die öffentliche Schnittstelle wird deutlich, dass es tatsächlich unveränderlich ist (außer bei Reflexion). Während Sie bei einer Eigenschaft nur sehen können, dass Sie sie nicht ändern können, müssen Sie sich auf die Dokumentation oder Implementierung beziehen.
Aber um ehrlich zu sein, verwende ich den ersten ziemlich oft im Anwendungscode, da ich faul bin. In Bibliotheken bin ich normalerweise gründlicher und folge der Konvention.
C # 6.0 fügt schreibgeschützte automatische Eigenschaften hinzu
public object MyProperty { get; }
Wenn Sie also keine älteren Compiler unterstützen müssen, können Sie eine wirklich schreibgeschützte Eigenschaft mit Code haben, der genauso präzise ist wie ein schreibgeschütztes Feld.
get; readonly set;
Option enthält.