2017-04-15 2 views
-1

Lassen Sie mich meine Frage umformulieren.Wie kann "while (true)" in diesem Code vermieden werden?

Bitte betrachten Sie das folgende Stück Code:

while (true) 
{ 
    Console.Write("Please enter something "); 
    userInput = Console.ReadLine(); 
    if (string.IsNullOrEmpty(userInput)) 
    { 
     break; 
    } 
    collection.Add(userInput); 
} 

Wie kann es geändert werden while (true) zu vermeiden?

+0

Code-Geruch ist subjektiv, und Standards sind zu viele zur Auswahl. Können Sie diese Frage in etwas umformulieren, das objektive Antworten bekommen kann? – hvd

+0

Ja, ich werde das tun. – menteith

Antwort

0

ich eher dieses Konstrukt sehen würde:

string userInput; 
bool again; 
do 
{ 
    Console.Write("Please enter something "); 
    userInput = Console.ReadLine(); 
    if (again = !string.IsNullOrEmpty(userInput)) 
     collection.Add(userInput); 
} while (again); 
+0

habe ich eine ähnliche Lösung gefunden mit dem Unterschied, dass ich keine Variable ('wieder') benutzt habe wie du. Ist es ein Problem, wenn Sie die gleiche bedingte Anweisung in verschiedenen Codeabschnitten verwenden? – menteith

+0

@menteih Das Überprüfen eines Boolean ist eine sehr effiziente Operation und ich denke, es gibt eine klare Absicht, was Sie erreichen wollen. – itsme86

1

können Sie versuchen, diese

do 
{ 
    Console.Write("Please enter something "); 
    userInput = Console.ReadLine(); 
    if (!string.IsNullOrEmpty(userInput)) 
    { 
     collection.Add(userInput); 
    } 
}while(!string.IsNullOrEmpty(userInput)); 
+3

Dies verhält sich nicht wie der OP-Code. Es dauert so lange, wie die Eingabe leer oder leer ist. Der OP-Code wird so lange fortgesetzt, wie die Eingabe * nicht * null oder leer ist. – hvd

+0

@hvd ist hier richtig. – menteith

+0

@menteih Die Moral der Geschichte - versuchen Sie nicht, ein perfekt gültiges Konstrukt zu vermeiden, das leicht zu lesen, leicht zu folgen ist, die notwendige Logik ohne künstliche 'Bool'-Variablen oder doppelte Zustandsprüfungen durchführt. –

2

Der Grund, warum Sie while (true) jetzt haben, ist, weil der erste Teil des Schleifenkörper nicht in passen der Schleifenzustand. Sie können deshalb while (true) vermeiden, indem Sie das in eine Funktion umgestalten.

bool TryGetUserInput(out string userInput) { 
    Console.Write("Please enter something "); 
    userInput = Console.ReadLine(); 
    return !string.IsNullOrEmpty(userInput); 
} 

... 

string userInput; 
while (TryGetUserInput(out userInput)) 
    collection.Add(userInput); 
+0

Dies ist in der Tat der sauberste Weg, falls das ursprüngliche Konstrukt überhaupt vermieden werden soll. Vor allem mit C# 7.0 lokalen Funktionen und "out var". –

0

Es ist bereits, dass Code Geruch ist subjektiv erwähnt worden, das wahr ist, aber in diesem Fall gibt es ein einfaches Argument gegen while(true) verwenden.

Sie verpassen eine Gelegenheit, in Ihrem Code ausdrucksstark zu sein. Betrachte:

while(true) 

Was sagt dir das über den Code? wir wissen nichts anderes als potenziell dieser Code wird unbegrenzt laufen.

Nun betrachten:

while(inputIsNotEmpty) 

sofort wissen, dass wir das Verfahren blockieren oder Anweisung ausgeführt werden soll, bis die Eingabe leer ist. Das wird dem Leser des Codes (meistens sich selbst) ein wenig Zeit ersparen, anstatt die Ausgangsbedingung aufzuspüren.

So würde ich vermeiden, while(true) in diesem speziellen Fall zu verwenden.

do{ 
    Console.Write("Please enter something "); 
    input = Console.ReadLine(); 
    if (inputIsNotEmpty(input)) collection.Add(input); 
    } while (inputIsNotEmpty(input); 

... 

bool inputIsNotEmpty(string input) => !String.IsNullOrEmpty(input); 
Verwandte Themen