2009-03-17 6 views

Antwort

5

Felder und Eigenschaften haben viele andere als semantische Unterschiede.

  1. Eigenschaften können überschrieben werden, um unterschiedliche Implementierungen in Nachkommen bereitzustellen.
  2. Eigenschaften können helfen, Versionierungsprobleme zu verringern. I.e. Das Ändern eines Felds in eine Eigenschaft in einer Bibliothek erfordert eine Neukompilierung von allem, das von dieser Bibliothek abhängt.
  3. Eigenschaften können unterschiedliche Zugriffsmöglichkeiten für den Getter und Setter haben.
+0

Ich denke, ich dachte nicht wirklich über die Kernunterschiede zwischen Eigenschaften und Feldern, wenn ich die Frage dankend stellte. –

+0

Sind das nicht alle semantischen Unterschiede? Ich versuche nicht, die Unterschiede zu trivialisieren - ich versuche nur zu betonen, dass "Semantik" keine triviale Angelegenheit ist. Es ist die Bedeutung von Wörtern: Wenn zwei Wörter völlig unterschiedliche Bedeutungen haben, dann sind sie semantisch verschieden, genauso wie Felder und Eigenschaften. –

+0

Ich denke, das hängt stark davon ab, wie öffentliche Felder vom LI-Interpreter implementiert werden. Wenn sie genau wie Eigenschaften behandelt werden (und sich so wie Funktionsaufrufe verhalten), dann habe ich recht. – scraimer

3

"Gerade Semantik" scheint immer wie ein Widerspruch in Bezug auf mich. Ja, es ändert die Bedeutung des Codes. Nein, das ist nicht etwas, worum ich das Wort "nur" benutzen würde.

Die erste Klasse hat ein öffentliches Feld. Die zweite Klasse hat eine öffentliche Eigenschaft, die von einem privaten Feld unterstützt wird. Sie sind nicht das Gleiche:

  • Wenn Sie später die Implementierung der Eigenschaft ändern, erhalten Sie binäre Kompatibilität. Wenn Sie das Feld in eine Eigenschaft ändern, gehen beide Binärquellen und Quellkompatibilität verloren.
  • Felder werden von Datenbindung nicht gesehen; Eigenschaften sind
  • Feldzugriff kann nicht in verwaltetem Code (AFAIK)
  • Machen ein Feld macht die Implementierung Ihrer Art breakpointed werden - eine Eigenschaft, nur spricht über die Vertrag Ihrer Art auszusetzen.

Für etwas mehr Details siehe my article about the goodness of properties.

0

Der erste ist nur ein öffentliches Feld, der zweite ist eine sogenannte automatische Eigenschaft. Automatische Eigenschaften werden vom C# -Compiler in reguläre Eigenschaften mit einem Hintergrundfeld geändert.

Öffentliche Felder und Eigenschaften sind in C# -Syntax gleich, aber sie sind unterschiedlich in IL (lesen Sie dies in einem deutschen Forum vor kurzem, kann Ihnen nicht die Quelle geben, sorry).

Matthias

2

In diesem Fall ist ja meistens Semantik. Es macht einen Unterschied für die Reflexion und so weiter.

Wenn Sie jedoch eine Änderung vornehmen möchten, dass wenn MyProperty festgelegt ist, z. B. ein Ereignis ausgelöst wird, können Sie letzteres problemlos ändern, um dies zu tun. Ersteres kannst du nicht. Sie können Letzteres auch in einer Schnittstelle angeben.

Da es so wenig Unterschied gibt, aber mehrere mögliche Vorteile, die Grundstücksroute hinunterzugehen, finde ich, dass Sie immer die Eigentumsroute hinunter gehen sollten.

0

Der größte Unterschied ist, dass Sie Zugriffsmodifikatoren zu Eigenschaften, zum Beispiel wie diese

public class MyClass 
{ 
    public bool MyProperty { get; protected set; } 
} 

Für den Zugriff auf die CLR Felder und Eigenschaften sind zu unterschiedlich hinzufügen können. Wenn Sie also ein Feld haben und es später in eine Eigenschaft ändern möchten (zum Beispiel, wenn Sie dem Setter Code hinzufügen möchten), wird sich die Schnittstelle ändern. Sie müssen den gesamten Code neu kompilieren, der auf dieses Feld zugreift. Mit einer Autoproperty haben Sie dieses Problem nicht.

0

Ich gehe davon aus, dass Sie keinen Code schreiben, der von Drittentwicklern aufgerufen wird, die ihren Code nicht neu kompilieren können, wenn Sie Ihren Code ändern. (z. B. dass Sie nicht für Microsoft arbeiten, das das .Net-Framework schreibt, ist es selbst, oder DevExpress, das einen Kontrolltoolkip schreibt). Denken Sie daran, dass Microsofts .NET-Framework-Codierungsstandard für die Leute ist, die das Framework schreiben, und versucht, viele Probleme zu vermeiden, die keine Probleme sind, wenn Sie kein Framework für die Verwendung von Drittentwicklern schreiben.

Der zweite Fall, der eine Angemessenheit definiert, der einzige wirkliche Vorteil der tun, ist, dass die Datenbindung nicht mit Feldern funktioniert. Es gibt jedoch einen großen politischen Vorteil bei der Verwendung von Eigenschaften, Sie erhalten viel weniger ungültige Beschwerden von anderen Entwicklern, die Ihren Code betrachten.

Alle anderen Vorteile für Eigenschaften (die in den anderen Antworten auf Ihre Fragen gut erklärt werden) sind für Sie zur Zeit nicht von Interesse, da jeder Programmierer, der Ihren Code verwendet, das Feld bei Bedarf später ändern kann kompilieren Sie einfach Ihre Lösung.

Allerdings ist es nicht wahrscheinlich, dass Sie für die Verwendung von Eigenschaften gestapelt werden, so dass Sie auch immer öffentliche Eigenschaften eher die Felder verwenden.

Verwandte Themen