none
Überladene Methode und Set Accessor RRS feed

  • Frage

  • Hallo,

    Ich versuche gerade mich in die C# Programmiersprache ein zu Arbeiten.

    Dabei habe ich folgende Fragen zu einer Methode in der ich eine Koordinate

    ändere.

    public void Move(double dx, double dy)
            {
                XCoordinate += dx;
                YCoordinate += dy;
            }

    Jetzt habe ich die Eigenschaft Methode folgendermaßen definiert

    public double XCoordinate { get { return _XCoordinate; } set { if (_XCoordinate > 100) Console.WriteLine("Objekt liegt außerhalb des zulässigen Bereiches"); else _XCoordinate = value; } }

    Aufgerufen wird die Methode folgender maßen.

    Circle kreis1 = new Circle();
    	double x =  kreis1.XCoordinate = 0;
            double y = kreis1.YCoordinate = 0;
    
    kreis1.Move(101, 50);
    
    Console.WriteLine("Der kreis1mittelpunkt liegt auf den Koordinaten: x = {0}  y = {1}", x, y);
    
    Console.WriteLine("Koordinaten neuer kreis1mittelpunkt nach Verschieben x={0}  y={1}", kreis1.XCoordinate, kreis1.YCoordinate);

    Ih hätte erwarte das diese Meldung ausgegeben wird.

    da ich ja der XKoordinate über Move einen wert zuweise der sie außerhalb des zulässigen

    Bereiches positioniert.

    Console.WriteLine("Objekt liegt ausserhalb des zulässigen Bereiches");

    Diese Ausgabe erreiche ich nur wenn der XCoordinate direkt einen zu großen Wert zuweise.

    double x =  kreis1.XCoordinate = 101

    Kann mir jemand erklären warum die Ausgabe das die XKoordinate außerhalb

    des Bereiches liegt nicht ausgegeben wird wenn sie über die Move Methode neu gesetzt wird.

    Wird beim verändern der XKoordinate innerhalb der Move Methode die Set Anweisung in der

    Eigenschaftsmethode ignoriert?

    Ich hoffe ich habe mein Problem halbwegs gut erklärt und es kann mir jemand weiterhelfen.

    Vielen dank schon im voraus für jede Hilfe.

    Gruß

    lizzy

    Mittwoch, 27. Januar 2016 16:01

Antworten

  • Hi,

    kann es sein, dass einfach deine Abfrage falsch ist?

    public double XCoordinate
    {
        get {
            return _XCoordinate;
        }
        set
        {
            if (value > 100)
                Console.WriteLine("Objekt liegt außerhalb des zulässigen Bereiches");
            else
                _XCoordinate = value;
        }
    }

    Du fragst im Setter nur _XCoordinate ab, also den aktuellen Wert. Du willst ja aber anscheinend wissen, ob der neue Wert > 100 ist, oder? Falls ja, müsstest Du value und nicht _XCoordinate abfragen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 27. Januar 2016 16:06
    Moderator

Alle Antworten

  • Hi,

    kann es sein, dass einfach deine Abfrage falsch ist?

    public double XCoordinate
    {
        get {
            return _XCoordinate;
        }
        set
        {
            if (value > 100)
                Console.WriteLine("Objekt liegt außerhalb des zulässigen Bereiches");
            else
                _XCoordinate = value;
        }
    }

    Du fragst im Setter nur _XCoordinate ab, also den aktuellen Wert. Du willst ja aber anscheinend wissen, ob der neue Wert > 100 ist, oder? Falls ja, müsstest Du value und nicht _XCoordinate abfragen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 27. Januar 2016 16:06
    Moderator
  • Hallo

    Vielen dank erstmal für deine Hilfe,

    Ich verstehe jetzt nicht ganz was du meinst.

    Ich dachte das ich ja Value abfrage.

    Wenn ich einen zu großen  Wert direkt  der XKoordinate übergebe

    double x =  kreis1.XCoordinate = 101;

    dann macht das Programm ja genau was ich will.

    Nur wenn die XKoordinate über die Move Methode verändert wird

    dann funktioniert es nicht so wie ich will.

    Das verstehe ich nicht ganz.

    Trotzdem nochmals Danke für deine Hilfe.

    Vielleicht wenn ich in einigen Wochen mehr von der Sprache C#

    gelernt habe wird sich mir erschließen wo hier mein Denkfehler ist.

    Danke und Gruß

    lizzy

    Mittwoch, 27. Januar 2016 16:28
  • Hallo Lizzy,

    wenn Du eine Eigenschaft auf einen neuen Wert setzt - was hier auch die Move Methode tut -, so wird der zu setzende Wert als value übergeben, siehe Verwenden von Eigenschaften (C#-Programmierhandbuch).

    Greifst Du jedoch auf die Variable _XCoordinate zu, so verwendest du den zuletzt gespeicherten Wert - der wäre im übrigen anfangs 0.

    Um es nachzuvollziehen, setze mal einen Breakpoint auf die if-Abfrage

    Nebenbei sollte man an der Stelle nicht Console.WriteLine sondern mit Ausnahmen arbeiten, hier wäre eine ArgumentOutOfRangeException die passendere Lösung. Dabei wird dann der Programmablauf unterbrochen, während bei einem WriteLine nur eine Textmeldung geschrieben würde, auf die am Ende vermutlich niemand achten würde.

    Gruß Elmar

    Mittwoch, 27. Januar 2016 16:53
    Beantworter
  • Halo Lizzy,

    wenn du eine Eigenschaft mit Setter und Getter selbst implementierst (also nicht einfach get; set; nutzt), dann bekommst du im Setter den zu setzenden Wert über den value-Parameter.

    Wie Stefan bereits schrieb, fragst du nun im Setter aber nicht value, sondern das hinter der Eigenschaft liegende _XCoordinate-Feld ab und dieses hat immer noch den alten Wert.

    Ob du den Wert per Methode innerhalb der Klasse oder direkt über die Eigenschaft setzt ist dabei egal. Die Meldung wirst du immer erst beim zweiten mal setzen der Eigenschaft erhalten, eben dann wenn das Feld dahinter den Wert erhalten hat.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 27. Januar 2016 16:53
    Moderator
  • Hallo,

    Vielen dank für eure Hilfe.

    Ich glaube jetzt habe ich es verstanden.

    Funktioniert jetzt auch wie ich es will.

    Lösung wurde ja schon von Stefan aufgezeigt, allerdings

    wollten ich das natürlich auch verstehen.

    gruss

    Lizzy

    Mittwoch, 27. Januar 2016 19:05