[c#] Unterschied zwischen Eigenschaft und Feld in C # 3.0+



Answers

Felder und Eigenschaften sehen gleich aus, sind es aber nicht. Eigenschaften sind Methoden und als solche gibt es bestimmte Dinge, die nicht für Eigenschaften unterstützt werden, und einige Dinge, die bei Eigenschaften auftreten können, aber nie bei Feldern.

Hier ist eine Liste der Unterschiede:

  • Felder können als Eingabe für out/ref Argumente verwendet werden. Eigenschaften können nicht.
  • Ein Feld liefert immer dasselbe Ergebnis, wenn es mehrmals aufgerufen wird (wenn wir Probleme mit mehreren Threads auslassen). Eine Eigenschaft wie DateTime.Now ist nicht immer gleich.
  • Eigenschaften können Ausnahmen auslösen - Felder werden das nie tun.
  • Eigenschaften können Nebenwirkungen haben oder sehr lange dauern. Felder haben keine Nebenwirkungen und werden immer so schnell sein, wie für den gegebenen Typ zu erwarten ist.
  • Eigenschaften unterstützen unterschiedliche Zugriffsmöglichkeiten für Getter / Setter - Felder nicht (aber Felder können nur readonly )
  • Bei der Verwendung von Reflection werden die Eigenschaften und Felder als unterschiedliche MemberTypes behandelt, sodass sie anders MemberTypes sind (z. B. GetFields GetProperties ).
  • Der JIT-Compiler kann den Zugriff auf Eigenschaften im Vergleich zum Feldzugriff sehr unterschiedlich behandeln. Es kann jedoch auf den gleichen nativen Code kompiliert werden, aber der Spielraum für Unterschiede ist da.
Question

Mir ist klar, dass es ein Duplikat von Was ist der Unterschied zwischen einem Feld und einer Eigenschaft in C #? aber meine Frage hat einen kleinen Unterschied (aus meiner Sicht):

Sobald ich das weiß

  • Ich werde meine Klasse nicht mit "Techniken, die nur an Eigenschaften arbeiten" und verwenden
  • Ich werde keinen Validierungscode im Getter / Setter verwenden.

Gibt es einen Unterschied (außer den Stil / zukünftige Entwicklung), wie eine Art Kontrolle bei der Einstellung der Eigenschaft?

Gibt es einen zusätzlichen Unterschied zwischen:

public string MyString { get; set; }

und

public string myString;

(Ich bin mir bewusst, dass die erste Version C # 3.0 oder höher erfordert und dass der Compiler die privaten Felder erstellt.)




Sie sollten immer Eigenschaften anstelle von Feldern für alle öffentlichen Felder verwenden. Dadurch wird sichergestellt, dass Ihre Bibliothek die Kapselung für jedes Feld implementieren kann, wenn dies in Zukunft erforderlich ist, ohne die vorhandenen Codes zu verletzen. Wenn Sie die Felder in vorhandenen Bibliotheken durch Felder ersetzen, werden alle abhängige Module, die Ihre Bibliothek verwenden, müssen ebenfalls neu erstellt werden.




Es gibt einen weiteren wichtigen Unterschied zwischen Feldern und Eigenschaften.

Wenn Sie WPF verwenden, können Sie nur an öffentliche Eigenschaften binden. Die Bindung an ein öffentliches Feld funktioniert nicht . Dies gilt auch, wenn Sie INotifyPropertyChanged nicht implementieren (obwohl Sie dies immer INotifyPropertyChanged sollten).




Der grundlegende Unterschied besteht darin, dass ein Feld eine Position im Speicher ist, an der Daten des angegebenen Typs gespeichert werden. Eine Eigenschaft stellt eine oder zwei Codeeinheiten dar, die ausgeführt werden, um einen Wert des angegebenen Typs abzurufen oder festzulegen. Die Verwendung dieser Zugriffsmethoden wird syntaktisch ausgeblendet, indem ein Element verwendet wird, das sich wie ein Feld zu verhalten scheint (da es auf beiden Seiten einer Zuweisungsoperation auftreten kann).




Der erste:

public string MyString {get; set; }

ist eine Eigenschaft; der zweite ( public string MyString ) bezeichnet ein Feld.

Der Unterschied besteht darin, dass bestimmte Techniken (ASP.NET-Datenbindung für Instanzen) nur für Eigenschaften und nicht für Felder funktionieren. Dasselbe gilt für die XML-Serialisierung: Nur Eigenschaften werden serialisiert, Felder werden nicht serialisiert.






Related