get; und set;



  • Hi.
    Habe eine Frage zu folgendem Konstrukt, welches mir im IRC gezeigt wurde:

    class myClass
    {
       public Vector2D Position{ get; set; }
    };
    

    Damit spar ich mir zwar einige Zeilen Code, aber ich kann so nicht als Beispiel folgendes machen:

    class myClass
    {
       public Vector2D Position{ get; set; }
       public void Relocate()
       {
           Position.Y += 5;
       }
    };
    

    Gibts da einen Trick dazu? Bin noch ein Rookie was C# angeht, aber probiere grade mit XNA rum und da kam dieses Problem auf.
    Danke



  • public Vector2D Position{ get; set; } // Deklariert eine Property als Readable und Writeable.
    

  • Administrator

    Vector2D ist eine Struktur, oder?
    Du solltest dir klar sein, dass Position keine Variable ist, sondern tatsächlich eine Funktion darstellt. Es gibt grundsätzlich zwei Funktionen, welche automatisch erzeugt werden:

    public Vector2D GetPosition() { /* ... */ }
    public void SetPosition(Vector2D value) { /* ... */ }
    

    Wenn du nun deinen Code auseinandernimmst, dann wird dies zu dem hier:

    GetPosition().Y += 5;
    

    Das macht natürlich keinen Sinn, weil die Struktur ist eben ein ValueType und wird also kopiert. Du erhöhst dann Y der Kopie, welche sofort wieder verworfen wird. Das ist in C# gar nicht erlaubt.

    Einen einfachen Weg gibt es da leider nicht.

    Vector2D copy = Position;
    copy.Y += 5;     // wir verändern die Kopie
    Position = copy; // und schreiben sie zurück.
    

    Grüssli



  • Scorcher24 schrieb:

    Gibts da einen Trick dazu? Bin noch ein Rookie was C# angeht, aber probiere grade mit XNA rum und da kam dieses Problem auf.
    Danke

    Nein, es gibt da keinen Trick. Der Trick ist nämlich, dass das eine "Kurzschreibweise" ist, für Fälle, wo man genau sowas nicht braucht.
    Braucht man es später dann doch, kann man jederzeit auf die "längere Schreibweise" umstellen, ohne dass das Interface der Klasse sich ändern würde.


Anmelden zum Antworten