2012-06-13 8 views
8

vedere il codice seguente:TryParse() - Perché questo codice restituisce 0, il risultato non dovrebbe essere -1?

string test = ""; 
int output = -1; 

if (int.TryParse(test, out output)) 
{ 
    Console.WriteLine("Parsed"); 
} 

Console.WriteLine(output); 

Quando TryParse() fallisce, non dovrebbe essere il blocco saltata, Console.WriteLine("Parsed") non chiamati e il valore di output essere uguali (-1)?

Sta tornando 0

+3

Si dovrebbe usare l'output solo all'interno di "if" perché è solo al suo interno che si sa che l'analisi è riuscita. –

risposta

10

L'attuazione di TryParseha per impostazione predefinita, il parametro di out prima di tornare in caso contrario non compilerà - indipendentemente dal fatto che avete inizializzato il parametro out dal lato di chiamata. Questo è il caso per il qualsiasi metodo con i parametri out e non è specifico per TryParse.

Le persone che lo hanno codificato hanno scelto default the parameter to zero quando l'analisi non riesce.

La parte importante è non si deve pensare che qualsiasi out metodi parametro onoreranno il valore originale del parametro out quando viene passato, infatti, può mai onore il parametro come il compilatore segnalerà:.

uso di non assegnata fuori parametro 'blah'

Se si tenta di utilizzare il valore del parametro prima di assegnare ad esso all'interno del metodo. In questo modo è possibile garantire che qualsiasi valore assegnato e assegnato a un parametro out verrà ignorato/sovrascritto.

+0

Grazie, ora ha perfettamente senso, anche se a prima vista è molto fuorviante. – dtsg

+0

@Duane Effettivamente può essere, ma tutto deriva dall'uso dei parametri 'out' - a parte il valore scelto come predefinito, qui non c'è niente di specifico per' TryParse'. –

2

se fallisce lo farà return false e non verrà eseguito il codice nella if.

Nel caso la conversione non riesce sarà anche retun 0 è per questo che output=0

15

Da MSDN:

Quando questo metodo contiene il valore intero con segno equivalente a 32 bit per il numero contenuto in stringa, se la conversione è riuscita, o zero se la conversione non è riuscita.

2

In C#, out i parametri devono essere assegnati a e non possono essere letti inizialmente da. (Quando viene avviato un metodo, i parametri out vengono considerati come variabili non inizializzate.)

Pertanto, il valore precedente di output non è rilevante. Doveva essere sovrascritto dalle persone che hanno scritto il metodo TryParse, altrimenti non avrebbe potuto essere compilato.

Allo stesso tempo, il metodo TryParse non ha accesso al valore precedente di output. Pertanto, è necessario scegliere un valore. In questo caso, the developers chose 0.