Öffentliches Feld oder Property?
-
Hi *,
einige Klassen von .NET stellen statische Member zur Verfügung.
Beispiele sind:Point.Empty Color.Red
Doch mir ist aufgefallen, dass zwischen diesen zweien ein Unterschied besteht.
Point.Empty ist ein öffentliches Feld, während Color.Red ein Property darstellt.Warum werden hier zwei verschiedene Mechanismen verwendet, um ein Datum zur Verfügung zu stellen?
Gibt es hierfür irgendwelche Gründe?Bin gespannt auf eure Antworten!
Schönen Abend noch!
-
Ich denke, dass es etwas mit der Art zu tun hat, wie die Daten verwendet werden sollen. Bei Dingen wie etwa
Point.Empty
ist anzumerken, dass es sich um echte Konstanten handelt - ein Konzept, welches sich mit Properties nur bedingt darstellen lässt. Oder um es in MSIL auszudrücken:.field public static initonly valuetype System.Drawing.Point Empty
Empty
ist und bleibt garantiert immer der gleiche Wert. Diese Semantik ist bei einer Property, und sei es eine readonly Property, nicht unbedingt gegeben. Der Vorteil liegt nun darin, dass eine Zuweisung von Empty an eine Instanz nicht darin resultieren muss, dass Empty als Feld zuerst noch geladen werden muss, sondern dass der Wert direkt als Konstante im Code verankert werden kann. Dabei handelt es sich zum einen um eine Optimierung, zum anderen - und vermutlich viel wichtiger - ist diese Eigenschaft des Konstant-bleibens für die Implementierung gewisser Metadaten wichtig. Denn übersetzt heisst dies: der WertSystem.Drawing.Point.Empty
steht garantiert auch fest, wenn man keinen Code ausführt. Diese Eigenschaft ist je nach Situation mehr oder weniger sinnvoll. Ein weiteres Beispiel:.field public static initonly valuetype System.Decimal Zero { .custom instance void System.Runtime.CompilerServices.DecimalConstantAttribute::.ctor(uint8, uint8, uint32, uint32, uint32) = { uint8(0) uint8(0) uint32(0) uint32(0) uint32(0) } }
Dieser Code definiert den Wert Null (also die Zahl) für
System.Decimal
, alsodecimal
. Es ist offensichtlich, dassSystem.Decimal.Zero
immer denselben Wert hat und auch haben wird. Weiter wird dieser Wert sehr oft gebraucht, da wollen wir nicht noch erst eine Property bitten, uns einen Wert zu geben, den wir verwenden sollen, sondern ihn direkt in den Metadaten ablegenGanz abgesehen von meiner hoffentlich richtigen Erklärung (teilweise Spekulation, also bitte nicht schlagen ) empfehle ich die Verwendung von Properties solange keine wichtigen Gründe dagegen sprechen.
MfG
EDIT: Cool, wie sich der Code über mein Browserfesnter hinaus erstreckt
-
Hi /rant/, danke erstmal für deine ausführlice Antwort!
Das was du erklärt hast mit den echten Konstanten leuchtet mir ein!
Auch wenn z.B. Color.Red ein (readonly) Property ist, wird dieser Wert auch gleich bleiben, denn man kann ihn nicht ändern! Das ist ja auch die Absicht der Klasse Color in diesem Fall, dass sie Member zur Verfügung stellt, die ihre Werte schon haben und die nicht mehr verändert werden können!
Wieso wurden in diesem Fall keine öffentlichen Felder benutzt?
Grüße