Probleme mit lokalen Variablen in C #
-
18-09-2019 - |
Frage
Ich habe ein paar Variablen, die innerhalb einer for-Schleife zugeordnet werden müssen. Offensichtlich, wenn die Schleife beendet, ignoriert C #, was dort passiert ist, und die Variablen in ihren ursprünglichen Zustand zurückgeführt. Insbesondere muss ich sie die letzten und nächsten zu letzten Elemente einer Liste sein. Hier ist der Code:
int temp1, temp2;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
// At this point, temp1 and temp2 are treated as uninitialized
Hinweis: Nevermind die schlechten Variablennamen, sie sind wirklich temporäre Variablen. Alles, was komplizierter würde die Dinge verwirren.
Nun gibt es zwei Möglichkeiten (die ich kenne), diese zu lösen: Die eine ist, herauszufinden, wie die Variablen, nachdem die Schleife beendet leben zu machen, sind die andere so etwas wie in Python zu tun, wo man temp = my_list[-1]
tun kann, um das letzte Element einer Liste bekommen. Ist eines dieser möglich in C #?
Bearbeiten: Wenn ich versuche, zu kompilieren, erhalte ich eine „Verwendung von nicht zugewiesenen lokalen Variablen‚temp1‘“ Fehler. Dieser Code wird nicht einmal laufen, es ist nur innerhalb einer Methode sitzen, die nie aufgerufen werden. Wenn das hilft, ich versuche, die Variablen in einer anderen Schleife zu verwenden.
Lösung
Warum nicht einfach tun ...
int temp1 = 0;
int temp2 = 0;
if (toReturn.Count > 1)
temp1 = toReturn[toReturn.Count - 2];
if (toReturn.Count > 0)
temp2 = toReturn[toReturn.Count - 1];
Andere Tipps
Wenn toReturn.Count 0 ist, die Schleife nie läuft und TEMP1 und TEMP2 nie initialisiert.
Was ist das?
if (toReturn.Count > 1) {
temp1 = toReturn[toReturn.Count - 2]
temp2 = toReturn[toReturn.Count - 1]
}
versuchen TEMP1 zu geben und TEMP2 einen Anfangswert d.h 0 oder was auch immer ist angemessen, weil sie vielleicht nie initialisiert werden
int temp1 = 0; // Or some other value. Perhaps -1 is appropriate.
int temp2 = 0;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
}
}
Der Compiler erfordert, dass temp1
und temp2
sind eindeutig zugewiesen bevor Sie versuchen, ihre Werte zu lesen. Der Compiler weiß nicht, Ihre for-Schleife die Variablen zuweist. Er weiß nicht, ob die for-Schleife jemals überhaupt läuft. Es ist auch nicht wissen, ob Ihre if-Bedingungen jemals true
werden.
Der obige Code stellt sicher, dass temp1
und temp2
etwas zugewiesen wurden. Wenn Sie sicher sein wollen, ob temp1
und temp2
zugewiesen wurden, in der Schleife , sollten Sie den Überblick über diese halten:
int temp1 = 0;
int temp2 = 0;
bool temp1Assigned = false;
bool temp2Assigned = false;
for (int i = 0; i < toReturn.Count; i++) {
if (i == toReturn.Count - 2) { // Next-to-last element
temp1 = toReturn[i];
temp1Assigned = true;
} else if (i == toReturn.Count - 1) { // Last element
temp2 = toReturn[i];
temp2Assigned = true;
}
}
Wenn Sie einen Standardwert mögen:
int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count > 0 ? toReturn[count - 1] : 0;
Wenn Sie kümmern sich nicht um Standardwert und haben den vorherigen Kontrollen für Zählung im Ort:
int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];