2016-04-20 19 views
-2

Nehmen Sie dieses Code-Snippet.TryParse platziert 0 für die Variable, wenn das Parsen fehlschlägt

string input = ""; 
int value = 10; 
bool success = int.TryParse(input, out value); 

Was ich in input verwenden, sei es null, "", "a", etc, wenn es keine gültige Zahl ist, gibt sie false und paces 0 in value.

Ist nicht TryParse() gemeint, um einen Bool zurückzugeben, der über Erfolg auf dem Parse informiert? Wenn das Parsen fehlschlägt, sollte es die Variable nicht einfach unverändert lassen?

Das ist nervig. Also brauche ich eine Variable, um den Wert vor dem Aufruf TryParse() zu halten, und eine if, um sein Ergebnis zu überprüfen, und im Falle eines Fehlers den vorherigen Wert zurück in die Variable kopieren?

Aktualisierung. Ich habe dieses Verhalten nicht in official doc beschrieben gefunden, können Sie zeigen, wo Microsoft es beschreibt?

Ich meine, Parsing im Allgemeinen und TryParse() speziell, ist nicht nur zum Parsen einer Zeichenfolge gemeint. Es soll auch die Zeichenfolge validieren. Wenn TryParse() fehlschlägt und false zurückgibt, handelt es sich weder um einen Fehler noch um eine Ausnahme. Dies bedeutet, dass die Zeichenfolge kein gültiges int (oder was auch immer der Datentyp ist), daher muss ich mit dieser ungültigen Zeichenfolge umgehen. Das erfordert wahrscheinlich den vorherigen Wert der Variablen. Wenn die Variable auf 0 gesetzt ist, ist der vorherige Wert verloren.

Warum einen Junk-Wert platzieren und den vorherigen Wert verlieren? Auf diese Weise würde ich, wie gesagt, eine zweite Variable brauchen, um diesen Wert zu halten, es ist eine Verschwendung.

Ich kann TryParse() erweitern oder umhüllen, aber ich muss das für alle Datentypen tun.

+2

Es kann nicht eingestellt werden - es ist ein "Out" -Parameter. Wenn Sie die von Ihnen gewünschte Funktionalität benötigen, wäre es nicht schwer, sie in eine andere Methode zu verpacken, die statt dessen einen ref-Parameter verwendet. –

+0

Es scheint mir, dass es genau so verhält, wie es dokumentiert ist: "Wenn diese Methode zurückkehrt, enthält die 32-Bit-Ganzzahl mit Vorzeichen den Wert in s, wenn die Konvertierung erfolgreich war, oder Null, wenn die Konvertierung fehlgeschlagen ist." –

+0

Lesen Sie diese Frage http://stackoverflow.com/questions/1078512/why-does-integer-tryparse-set-result-to-zero-on-failure –

Antwort

2

int.TryParse konvertiert die Zeichenfolgendarstellung einer Zahl in ihre 32-Bit-Ganzzahl mit Vorzeichen. Ein Rückgabewert gibt an, ob die Operation erfolgreich war. Was wir also tun können, ist:

if(int.TryParse(input, out value)) 
{ 
// proceed with your code 
} 
else 
{ 
// show some message that the input is not valid 
}