Ö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 Wert System.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 , also decimal . Es ist offensichtlich, dass System.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 ablegen 😃

    Ganz 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


Log in to reply