2010-08-02 3 views
8

Warum ist das:Zweck der automatischen Eigenschaften in .NET

public string Foo {get;set;} 

besser angesehen als das:

public string Foo; 

Ich kann nicht für das Leben von mir, es funktioniert. Kann jemand etwas Licht abwerfen?

Dank

+1

Wie immer, wenn dieses Thema erscheint, lesen Sie Jon Skeet> ** [Warum Eigenschaften wichtig sind] (http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx) ** –

Antwort

12

Weil Sie transparent kann (aus Sicht des Client-Code) die Umsetzung des Setter/Getter ändern wheras Sie nicht das gleiche tun können, wenn Sie die zugrunde liegenden Immobilie direkt aussetzen (wie es nicht binärkompatibel sein würde.)

Es gibt einen bestimmten Code Geruch mit automatischen Eigenschaften verbunden, obwohl, dass es weit zu einfach, einen Teil des Zustands Ihrer Klasse ohne einen zweiten Gedanken zu offenbaren. Dies hat auch Java betroffen, wo in vielen Projekten get/setXxx Paare überall zu finden sind, die den internen Zustand offenlegen (oft ohne Notwendigkeit dafür, "nur für den Fall"), was die Eigenschaften im Wesentlichen öffentlich macht.

+0

Dies ist die Antwort - wenn Sie möchten Um die Art zu ändern, wie Foo berechnet oder gespeichert wird, kannst du es transparent machen. –

+1

Ich verstehe nicht, warum Sie nicht transparent vom direkten Feldzugriff auf eine Eigenschaft ändern können. Der Clientcode würde weiterhin myObject.Foo = bar oder Console.Write (myObject.Foo) verwenden. Keine Änderungen am Client-Code ... – David

+6

@David: Wetten Sie? a) es ist definitiv nicht binärkompatibel, also müsstest du * mindestens * neu kompilieren. b) Es ist in manchen Situationen nicht quellkompatibel - Sie können beispielsweise ein Feld als Argument für einen out-Parameter verwenden, aber Sie können keine Eigenschaft verwenden. Dann gibt es etwas, das Reflexion verwendet (wie Datenbindung). Sag einfach Nein zu öffentlichen Feldern ... –

1

Während der Zweck eines Feld Objektzustand Speicher ist, der Zweck einer Eigenschaft ist nur Zugang. Der Unterschied mag konzeptioneller als praktischer Natur sein, aber automatische Eigenschaften bieten eine praktische Syntax, um beide zu deklarieren.