Ich bin in Endlosschleife im property-setter
public int Position
{
get
{
if (Session["Position"] != null)
{
Position = Convert.ToInt32(Session["Position"]);
}
else
{
Position = 5;
}
return Position;
}
set
{
Position = value;
}
}
mein Programm ruft die get-und geht in die if-Schleife und dann läuft infitely in den code einstellen, der
- hat der korrigierte code, aber weiter erklären, warum: Denken Sie an diese Getter und setter als Funktionen, weil das ist, was Sie hinter den kulissen. Wenn eine Funktion sich selbst aufruft und innerhalb, ohne ein Mittel zu beenden, werden Sie in eine unendliche Schleife.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Fehler ist, da in Ihr
set {}
werden Sie den Aufruf der gleichen Set-rekursiv.Richtige code wäre
this
zur gleichen Zeit. Die meisten Leute werden erkennen, dass der Unterstrich bedeutet, dass Sie in Bezug auf ein Mitglied vor Ort, und es gibt nichts, das muss disambiguated.this
sollte zwingend immer.Verwenden Sie eine member-variable oder vielleicht speichern Sie es in der Sitzung.
Es gibt nichts besonders-string-wie etwa session-state Elemente.
Warum würden Sie nicht einfach Folgen Sie dem KISS-Prinzip und etwas tun, wie
oder (abhängig von Ihren tatsächlichen Anforderungen/Spezifikationen:
int
?int
ist-Wert geben, wie kann es seinas
?Nullable<int>
, ein Referenz-Typ (und spezielle, zu Booten). Eine geradeint
erhalten boxed in der session zu speichern; eineint?
ist für alle Absichten und Zwecke, schon boxed. Siehe die Skillung, ISO 23270 § 14.9.11: Der as-operator wird verwendet, um explizit konvertiert einen Wert in einen bestimmten Referenz-Typ oder null-Werte zulässt Typ...Bei der Konvertierung in einen nullable-Typ, der auch als operator verwendet eine Verpackung Konvertierung, ein unboxing-Konvertierung, oder ein null-Typ-Umwandlung (§13.7.1)...wenn die angegebene Umwandlung ist nicht möglich, der resultierende Wert ist null.Eine automatisch implementierte Eigenschaft Anwesen besteht aus einem getter einen setter und ein Feld sichern. Wenn Sie den code selbst schreiben, ein Feld kann nicht notwendig sein.
Ihre getter ruft setter und setter aufruft setter; das wäre eine unendliche Rekursion. Müssen Sie möglicherweise ein Feld für die Speicherung
Position
.Allerdings, wenn wir ändern es mit der Speicherung auf einem Feld, und der setter in der Tat nicht wirksam. So konnte der code geändert werden:
Müssen Sie nicht auf null prüfen,
Convert.ToInt32(null)
null ist.