Problemi con le variabili locali in C #
-
18-09-2019 - |
Domanda
Ho un paio di variabili che devono essere assegnati all'interno di un ciclo for. A quanto pare, quando il ciclo si interrompe, C # ignora tutto ciò che è accaduto in là, e le variabili vengono restituiti al loro stato originale. In particolare, ho bisogno di loro di essere gli ultimi e next-to-last elementi di una lista. Ecco il codice:
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
Nota: Nevermind i nomi delle variabili cattivi, sono variabili davvero temporanee. Qualcosa di più complesso sarebbe confondere le cose.
Ora, ci sono due modi (che io sappia) per risolvere questo: uno è capire come fare le variabili vivono dopo il ciclo termina, l'altro è quello di fare qualcosa di simile in Python, dove si può fare temp = my_list[-1]
a ottenere l'ultimo elemento di una lista. È uno di questi possibili in C #?
Modifica Quando provo a compilare, ottengo un "uso di non assegnata variabile locale 'temp1'" errore. Questo codice non è nemmeno eseguito, è solo seduto all'interno di un metodo che non viene mai chiamato. Se questo aiuta, sto cercando di utilizzare le variabili all'interno di un altro ciclo.
Soluzione
Perché non solo fare ...
int temp1 = 0;
int temp2 = 0;
if (toReturn.Count > 1)
temp1 = toReturn[toReturn.Count - 2];
if (toReturn.Count > 0)
temp2 = toReturn[toReturn.Count - 1];
Altri suggerimenti
Se toReturn.Count è 0, il ciclo non finisce mai e temp1 e temp2 sono mai inizializzati.
Di cosa si tratta fare?
if (toReturn.Count > 1) {
temp1 = toReturn[toReturn.Count - 2]
temp2 = toReturn[toReturn.Count - 1]
}
cercare di dare temp1 e temp2 un valore cioè iniziale di 0 o qualsiasi altra cosa è appropriato perché potrebbero non essere inizializzati
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];
}
}
Il compilatore richiede che temp1
e temp2
sono sicuramente assegnato prima di provare a leggere i loro valori. Il compilatore non conosce il vostro ciclo for assegnerà le variabili. E non sa se il ciclo for mai corre a tutti. Inoltre non so se sarà mai true
tuoi se-condizioni.
Il codice di cui sopra fa in modo che temp1
e temp2
sono stati assegnati a qualcosa. Se si vuole essere sicuri se temp1
e temp2
sono stati assegnati nel loop , considerate di tenere traccia di questo:
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;
}
}
Se si desidera un valore di default:
int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count > 0 ? toReturn[count - 1] : 0;
Se non si preoccupano di valore predefinito e avere controlli precedenti per il conteggio in atto:
int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];