Question

Oh, 2 choses: 1) C'est une application console. 2) Je sais que c'est en danois, mais ça n'a pas d'importance, c'est juste un exemple de demande d'information. Le texte et les variables n'ont pas d'importance.

Bien, considérons cette entrée simple: Ce pourrait être vraiment une sorte de question d’entrée.

Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
kundenummer = Convert.ToInt16(inputKnr);

Maintenant, qu'en est-il si le client tape quelque chose qui ne va pas? Comme une lettre. A essayer & Amp; catch s'assurerait que l'application ne se casse pas, mais ce n'est pas la solution que je veux. Je veux qu'il dise que vous avez mal fait, essayez à nouveau. Assez classique, n'est-ce pas?

Mais quel est le meilleur moyen de résoudre cette solution? J'ai pensé à ceci:

bool fangetKundenummer = true;
while (fangetKundenummer)
{
Console.WriteLine("Hvad er dit kundenummer: (Kun hele tal tilladt)");
string inputKnr = Console.ReadLine();
try
{
    kundenummer = Convert.ToInt16(inputKnr);
    fangetKundenummer = false;
}
catch
{
    Console.WriteLine("Fejl. Prøv igen");
}
}

Mais cela ne semble pas être la bonne façon de le faire.

En outre, juste pour le mentionner, cette petite application avec laquelle je joue a 4 questions d'entrée d'affilée . Cela voudrait dire 4 fois cette vilaine boucle while ().

Vous pouvez également écrire une fonction. Quelque chose comme ça (aucune raison de le faire correctement, c’est juste pour illustrer un concept):

static void verifyInput()
{
    try
    {
        Console.WriteLine("question");
        input = Console.ReadLine();
        kundenummer = Convert.ToInt16(input)
    }
    catch
    {
        Console.WriteLine("Wrong. Do it over");
        verifyInput(); //start the function all over
    }
}

Mais vous auriez à écrire une fonction pour chaque question d’entrée, même s’ils pourraient demander exactement la même chose! (signifiant peut-être que tous demandent un entier, mais avec une question et une variable différentes).

Cela ne semble pas beaucoup mieux que la solution while ().

Quelqu'un a-t-il une idée intelligente?

Était-ce utile?

La solution

Utilisez Int16.TryParse et les équivalents. pour d'autres types numériques. Tous ces éléments renvoient un résultat booléen indiquant le succès ou l'échec de l'analyse et prennent un paramètre out qui est défini sur le résultat de l'analyse (ou sur 0 en cas d'échec). Dans votre cas, vous voudrez peut-être inclure l’appel dans une méthode pour continuer à demander:

static Int16 PromptForInt16(string prompt)
{
    while (true)
    {
        Console.Write(prompt);
        Int16 result;
        if (Int16.TryParse(Console.ReadLine(), out result))
        {
            return result;
        }
        Console.WriteLine("Sorry, invalid number entered. Try again.");
    }
}

Autres conseils

Vous pouvez utiliser le modèle TryParse:

string s; // for "is not valid" message
short val; // final value
while(!short.TryParse(s=Console.ReadLine(), out val)) {
    Console.WriteLine(s + " is not valid...");
}

Juste pour varier, que diriez-vous de tester la chaîne elle-même, au lieu de TryParse, ce qui nécessiterait de l'espace de stockage supplémentaire et potentiellement une distribution inutile?

static void Main(string[] args)
{
    var isFalse = "t".IsInt();
    var isTrue = "123".IsInt();
    var isAlsoFalse = "123.1".IsInt();

}

static bool IsInt(this IEnumerable<char> s)
{
    return s.All(x => char.IsNumber(x));
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top