2017-02-21 3 views
-4
 int VillainId = -1; 
     Console.Write("Enter VillainId: "); 
     while (!int.TryParse(Console.ReadLine(), out VillainId)) 
     { 
      Console.WriteLine("You need to enter a valid Villain Id!"); 
      Console.Write("Enter VillainId: "); 
     } 

Quelqu'un peut-il me dire comment fonctionne le code à l'intérieur du while(**this code here**){//rest of the code}? Je comprends si c'était dans le {} mais c'est dans la condition et son bouclage jusqu'à ce qu'il réussisse à analyser un nombre. Comment ça marche ?Exécution de code dans l'instruction d'expression while

+1

'int.TryParse' renvoie true si elle analyse avec succès la chaîne, il devient de Console.ReadLine(). Le '!' Devant signifie inverser le booléen, donc 'while' exécute le code dans les parenthèses, et si int.TryParse renvoie false, le' while' s'exécute à nouveau - et encore et encore, jusqu'à 'int.TryParse' renvoie true. –

+1

donc si je comprends bien si c'est faux, il fait le travail dans le {} alors vérifiez à nouveau et par là vous voulez dire qu'il exécute l'ensemble try.parse à nouveau et si réussi outs l'int et renvoie vrai? –

+1

C'est vrai, chaque fois que ça recommence, ça appelle 'Console.ReadLine()' encore une fois pour une nouvelle entrée, passe ça 'int.TryParse()' qui essaye d'analyser la nouvelle valeur, etc., jusqu'à l'analyse est réussi et il sort de la boucle. Une [boucle do/while] (https://msdn.microsoft.com/en-us/library/370s1zax.aspx?f=255&MSPPError=-2147217396) est une autre façon d'écrire ce code, et pourrait être plus facile d'obtenir votre la tête autour. –

Répondre

3

int.TryParse renvoie true si la chaîne avec succès parse il devient de Console.ReadLine(). Le ! en face de cela signifie inverser la valeur booléenne renvoyée par int.TryParse, donc le while exécute le code dans les parens, et si int.TryParse renvoie false, le false est inversé en true et le while s'exécute à nouveau - et encore et encore , jusqu'à int.TryParse renvoie true. "Le while s'exécute" signifie que le code dans les parens s'exécute en premier, et que si le résultat est true, le corps du while s'exécute également.

Voici une autre façon d'écrire le même code. Il est un peu moins compact, mais peut-être plus facile à suivre:

int VillainId = -1; 
bool parseOK = false; 
do 
{ 
    Console.Write("Enter VillainId: "); 

    parseOK = int.TryParse(Console.ReadLine(), out VillainId); 

    if (!parseOK) 
    { 
     Console.WriteLine("You need to enter a valid Villain Id!"); 
    } 
} while (! parseOK); 
2

int.TryParse() retours true si la conversion a réussi et la ! (logical negation operator) Inverse la valeur boolean dans son côté droit (!true est égale à false).

La condition dans whileest évaluée chaque boucle, de sorte que, chaque entrée valide le code de bloc dans while() sera exécutée.

Le flux est, essentiellement:

Console.Write("Enter VillainId: "); 
// asks to user input 

while (!int.TryParse(Console.ReadLine(), out VillainId)) 
// while the conversion is not successfull 
{ 
    Console.WriteLine("You need to enter a valid Villain Id!"); 
    Console.Write("Enter VillainId: "); 
    // asks for user to input valid data 
} 
+0

que je comprends, ce qui me dérange est la boucle while exécuter le try.parse chaque fois qu'il vérifier la condition? –

+0

@StoyanGrigorov Exécutez le code et découvrez par vous-même. – Servy

+0

Après avoir lu les commentaires d'Ed Plunkett je comprends maintenant comment cela fonctionne clairement. Merci pour l'entrée :) –