Problemas com variáveis ??locais em C #
-
18-09-2019 - |
Pergunta
Eu tenho um par de variáveis ??que precisam ser atribuídas dentro de um loop for. Aparentemente, quando o loop termina, C # ignora tudo o que aconteceu lá dentro, e as variáveis ??são devolvidos ao seu estado original. Especificamente, eu preciso que eles sejam os últimos e próximos ao último elementos de uma lista. Aqui está o código:
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: o Nevermind os nomes de variáveis ??ruins, eles são variáveis ??realmente temporários. Qualquer coisa mais complexa iria confundir as coisas.
Agora, há duas maneiras (que eu saiba) para resolver este: um é descobrir como fazer com que as variáveis ??viver após o loop termina, a outra é fazer algo como em Python, onde você pode fazer temp = my_list[-1]
para obter o último elemento de uma lista. É qualquer um destes possível em C #?
Editar: Quando tento compilar, obtenho um "uso da variável 'temp1' não atribuído local" erro. Este código não é mesmo funcionar, é apenas sentado dentro de um método que nunca é chamado. Se isso ajuda, eu estou tentando usar as variáveis ??dentro de outro loop.
Solução
Porque não basta fazer ...
int temp1 = 0;
int temp2 = 0;
if (toReturn.Count > 1)
temp1 = toReturn[toReturn.Count - 2];
if (toReturn.Count > 0)
temp2 = toReturn[toReturn.Count - 1];
Outras dicas
Se toReturn.Count é 0, o loop não é executado e temp1 e temp2 nunca são inicializados.
O que é isso fazer?
if (toReturn.Count > 1) {
temp1 = toReturn[toReturn.Count - 2]
temp2 = toReturn[toReturn.Count - 1]
}
Tente dar temp1 e temp2 um valor ou seja inicial 0 ou o que for apropriado, porque eles nunca pode ser inicializado
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];
}
}
O compilador requer que temp1
e temp2
são definitivamente atribuído , antes de tentar ler seus valores. O compilador não sabe o seu ciclo for irá atribuir as variáveis. Ele não sabe se o loop nunca é executado em tudo. Ele também não sabe se seus if-condições sempre será true
.
O código acima garante que temp1
e temp2
foram atribuídos a algo. Se você quiser ter certeza se temp1
e temp2
foram atribuídos no circuito , considere manter o controle deste:
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 você quiser um valor padrão:
int count = toReturn.Count;
int temp1 = count > 1 ? toReturn[count - 2] : 0;
int temp2 = count > 0 ? toReturn[count - 1] : 0;
Se você não se preocupam com valor padrão e têm verificações anteriores para contagem no lugar:
int count = toReturn.Count;
int temp1 = toReturn[count - 2];
int temp2 = toReturn[count - 1];