Benutzer mit den meisten Antworten
Überladene Methode und Set Accessor

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
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- Als Antwort vorgeschlagen Elmar BoyeEditor Mittwoch, 27. Januar 2016 16:26
- Als Antwort markiert Aleksander Chalabashiev Montag, 1. Februar 2016 10:13
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- Als Antwort vorgeschlagen Elmar BoyeEditor Mittwoch, 27. Januar 2016 16:26
- Als Antwort markiert Aleksander Chalabashiev Montag, 1. Februar 2016 10:13
-
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
-
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
-
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