Laden...

Mal ne Verständnissfrage zu get;set;

Erstellt von elektrogandalf vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.531 Views
E
elektrogandalf Themenstarter:in
7 Beiträge seit 2007
vor 17 Jahren
Mal ne Verständnissfrage zu get;set;

was genau bringt mir get und set?
Ich kann doch genau sogut einfach ein Public-Attribut anlegen oder nicht?

F
722 Beiträge seit 2005
vor 17 Jahren

hallo,
in gewisser weise schon, dann wenn du den wert des properties durch get und set einfach ein ein privates feld weiterreichst. properties machen da sinn, wo der zugriff durch entsprechenden code kontrolliert wird. das ist mit public attributen nicht möglich. weiterhin sind properties vorraussetzung um beispielsweise (designerfähige) GUI komponenten zu erstellen.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo elektrogandalf1,

öffentliche Felder machen nie Sinn. Immer stattdessen Properties verwenden. Auch wenn set und get nicht mehr macht, als ein privates Feld zu setzen bzw. zu liefern. Es ist eine konzeptionelle Frage. Felder sind für den inneren Zustand, Properties für den äußeren Zustand. Es gibt diverse Unterschiede, die auf den ersten Blick nicht sichtbar sind. Deshalb immer Properties statt öffentlichen Feldern verwenden.

herbivore

Gelöschter Account
vor 17 Jahren

also um dir mal ein paar weitergehende anwendungsfälle zu erläutern:
(quelle: hier)

À� Statusvariablen
Sie können dafür verwendet werden, komplexe Statusabfragen scheinbar in einer Variablen
zu bündeln

À� Späte Initialisierung
Bei der späten Initialisierung (engl. lazy init) wird die Eigenschaft der Properties ausgenutzt,
dass ihre get- bzw. set-Methoden erst aufgerufen werden, wenn der Zugriffsoperator
es auslöst. Ist es beispielsweise für das Auslesen eines bestimmten Properties
notwendig, eine Verbindung zu einem entfernten Server aufzubauen, um an Online-
Daten zu gelangen, so ist es möglich mittels eines Properties erst dann tatsächlich
den zeit- und kostenintensiven Verbindungsaufbau zu einer serverbasierten Datenbank
aufzubauen, wenn auch tatsächlich Daten übertragen werden. Die Alternative wäre
bereits zum Progammstart mit einer Init-Routine die Serververbindung aufzubauen.
Kosten könnten durch die nichtbenutzte aber aufgebaute Verbindung verursacht werden
(Internet per Mobiltelefon o. ä.). Manche Programme starten zwar, greifen aber
aus welchen Gründen auch immer, nicht auf den Server zu (Benutzerabbruch).

À� Schutz
Unter diesem allgemein gehaltenen Punkt kann man die Zugriffskontrolle über Daten,
die in einer bestimmten Form aufbereitet sein müssen, z.B. Schlüssel, fassen. Mit der
Property-Methode kann leicht erreicht werden, dass nur ein exakt den Anforderungen
an eine Indexschlüsselaufbau entsprechende Daten in ein durch Property-Zugriff
geschütztes Feld vorgenommen werden können. Es gibt auch noch einfach die Möglichkeit
durchWeglassen z.B. der set-Methode es überhaupt nicht zuzulassen, dass der
Benutzer einer Klasse auf ein gewisses Datenelement zugreift.

À� Kontrolle
Neben dem im voherigen Punkt angsprochenen Schutz kann es ebenso sinnvoll sein zu
Kontrollzwecken bei bestimmten Zugriffen beispielsweise Protokollskripte ablaufen
zu lassen.

4.207 Beiträge seit 2003
vor 17 Jahren

Original von herbivore
Es gibt diverse Unterschiede, die auf den ersten Blick nicht sichtbar sind.

Welche?

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

4.506 Beiträge seit 2004
vor 17 Jahren

Hallo Golo,

Welche?

Ich denke hier geht es um Designänderungen, Skalierbarkeit oder Wartbarkeit.

Während man testweise das Property z.B. Debuggen kann, und somit Wertänderungen der "Statusvariablen" nachverfolgen kann, kann man das mit öffentlichen Feldern nicht. Genauso kann man Logging/Locking-Verfahren in den Settern verarbeiten, auch das geht mit Feldern nicht.

Aber eigentlich behaupte ich mal, dass Du das auch weißt, oder worauf willst Du hinaus?

Gruß
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

4.207 Beiträge seit 2003
vor 17 Jahren

In dem von Dir genannten Fall wäre get+set aber semantisch nicht identisch mit einer reinen Variable.

Ich hatte Herbivore aber so verstanden (eventuell auch missverstanden?), dass bereits bei einem ganz einfachen get / set bereits Unterschiede zu einer Variablen bestehen, die nur nicht offensichtlich sind.

Daher meine Frage - welche?

Mir ist klar, dass der Zugriff technisch gesehen anders stattfindet, aber sonst?

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Golo,

die Frage hatte ich dir, wenn ich mich recht entsinne, schon mal beantwortet. 🙂 Um nur einige Beispiele zu nennen: XML-Serialisierung, PropertyGrid, ...

herbivore

PS: Weitere Threads zu Properties vs. Fields:
getter und setter
Get / Set
Und es gibt sicher noch weitere.

In diesem Zusammenhang sicher auch interessant:
Property oder Member innerhalb der Klasse adressieren

S
8.746 Beiträge seit 2005
vor 17 Jahren

Original von Golo
Daher meine Frage - welche?

Versuche mal ein Property mit Setter als out/ref-Parameter zu verwenden. Geht nicht. Ein Property hingegen kann man threadsafe machen.