Question

Je ne suis pas sûr de savoir pourquoi j'obtiens cette erreur, mais ce code ne devrait pas être compilé, car je vérifie déjà si la file d'attente est en cours d'initialisation?

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());
}

Donc, si la file d'attente n'est pas initialisée, les boucles for ne sont pas accessibles, n'est-ce pas? Puisque le programme se termine déjà avec Environment.Exit (0)?

J'espère que vous pourrez me donner quelques conseils:)

Merci.

Était-ce utile?

La solution

Le compilateur ne sait pas que Environment.Exit () va terminer le programme; il vous voit juste en train d'exécuter une méthode statique sur une classe. Initialisez simplement la file d'attente sur null lorsque vous le déclarez.

Queue queue = null;

Autres conseils

Le compilateur ne sait pas que Environment.Exit () ne sera pas renvoyé. Pourquoi ne pas simplement "retourner" de Main ()?

Différentes façons de résoudre le problème:

Il suffit de remplacer Environment.Exit par return. Le compilateur sait que return met fin à la méthode, mais ne sait pas que Environment.Exit le sait.

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;   
}

Bien sûr, vous ne pouvez vraiment vous en sortir, car vous utilisez 0 comme code de sortie dans tous les cas. Vraiment, vous devriez retourner un int au lieu d'utiliser Environment.Exit. Pour ce cas particulier, ce serait ma méthode préférée

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;
    }
}

Initialisez la file d'attente sur la valeur null, ce qui n'est en réalité qu'une astuce de compilation qui dit "Je vais découvrir mes propres variables non initialisées, merci beaucoup". C'est un truc utile, mais dans ce cas, je n'aime pas trop - vous avez trop de branches pour vérifier facilement que vous le faites correctement. Si vous voulez vraiment le faire de cette façon, quelque chose comme ceci serait plus clair:

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());
}

Ajouter une instruction de retour après Environment.Exit. Encore une fois, il s’agit plutôt d’une astuce de compilation - mais elle est légèrement plus légitime que l’OMI car elle ajoute également une sémantique pour les humains (même si cela vous évitera une couverture de code à 100% tant vantée)

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());
}

Le compilateur sait uniquement que le code est ou n'est pas accessible si vous utilisez "return". Pensez à Environment.Exit () comme une fonction que vous appelez et le compilateur ne sait pas qu'il va fermer l'application.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top