C # erro: uso de variável local não atribuída
-
05-07-2019 - |
Pergunta
Eu não tenho certeza por isso que eu estou recebendo este erro, mas não deve esta compilação de código, desde que eu já estou verificando para ver se a fila está sendo inicializado?
public static void Main(String[] args)
{
Byte maxSize;
Queue queue;
if(args.Length != 0)
{
if(Byte.TryParse(args[0], out maxSize))
queue = new Queue(){MaxSize = maxSize};
else
Environment.Exit(0);
}
else
{
Environment.Exit(0);
}
for(Byte j = 0; j < queue.MaxSize; j++)
queue.Insert(j);
for(Byte j = 0; j < queue.MaxSize; j++)
Console.WriteLine(queue.Remove());
}
Então, se fila não é inicializado, então o para loops não estão bem acessível? Desde que o programa já termina com Environment.Exit (0)?
Hope ya pode me dar algumas dicas:)
Graças.
Solução
O compilador não sabe que o Environment.Exit () vai terminar o programa; ele só vê você executar um método estático em uma classe. queue
apenas initialize como nulo quando você declará-lo.
Queue queue = null;
Outras dicas
O compilador não sabe que Environment.Exit () não retorna. Porque não basta "retorno" de Main ()?
Um par de maneiras diferentes para resolver o problema:
Basta substituir Environment.Exit com retorno. O compilador sabe que o retorno termina o método, mas não sabe que Environment.Exit faz.
static void Main(string[] args) {
if(args.Length != 0) {
if(Byte.TryParse(args[0], out maxSize))
queue = new Queue(){MaxSize = maxSize};
else
return;
} else {
return;
}
Claro, você só pode realmente ir longe com isso porque você está usando 0 como seu código de saída em todos os casos. Realmente, você deve retornar um int em vez de usar Environment.Exit. Para este caso particular, este seria o meu método preferido
static int Main(string[] args) {
if(args.Length != 0) {
if(Byte.TryParse(args[0], out maxSize))
queue = new Queue(){MaxSize = maxSize};
else
return 1;
} else {
return 2;
}
}
Inicializar fila para null, que é realmente apenas um truque do compilador que diz "eu vou descobrir minhas próprias variáveis ??não inicializadas, muito obrigado". É um truque útil, mas eu não gosto neste caso - você tem muitos se ramos para verificar facilmente que você está fazendo isso corretamente. Se você realmente queria fazê-lo desta forma, algo como isso seria mais claro:
static void Main(string[] args) {
Byte maxSize;
Queue queue = null;
if(args.Length == 0 || !Byte.TryParse(args[0], out maxSize)) {
Environment.Exit(0);
}
queue = new Queue(){MaxSize = maxSize};
for(Byte j = 0; j < queue.MaxSize; j++)
queue.Insert(j);
for(Byte j = 0; j < queue.MaxSize; j++)
Console.WriteLine(queue.Remove());
}
Adicionar uma instrução de retorno após Environment.Exit. Mais uma vez, este é mais um truque do compilador - mas é um pouco mais legítimo IMO porque acrescenta semântica para os seres humanos, bem como (embora ele vai mantê-lo de que a cobertura de código alardeada 100%)
static void Main(String[] args) {
if(args.Length != 0) {
if(Byte.TryParse(args[0], out maxSize)) {
queue = new Queue(){MaxSize = maxSize};
} else {
Environment.Exit(0);
return;
}
} else {
Environment.Exit(0);
return;
}
for(Byte j = 0; j < queue.MaxSize; j++)
queue.Insert(j);
for(Byte j = 0; j < queue.MaxSize; j++)
Console.WriteLine(queue.Remove());
}
O compilador só sabe que o código é ou não é alcançável se você usar o "retorno". Pense Environment.Exit () como uma função que você chama, e o compilador não sabe que ele vai fechar o aplicativo.