2012-06-13 20 views
8

Véase el siguiente código:TryParse() - ¿Por qué este código devuelve 0, no debería el resultado ser -1?

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

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

Console.WriteLine(output); 

Cuando TryParse() falla, no debe el bloque puede ser saltado, Console.WriteLine("Parsed") no llama y el valor de output ser el mismo (-1)?

Está volviendo 0

+3

Debe usar 'output' solo dentro del' if' porque solo dentro de él sabe que el análisis tuvo éxito. –

Respuesta

10

La implementación de TryParsetiene a los valores de los parámetros out antes de regresar de lo contrario no se compilará - independientemente de si ha inicializado el parámetro out desde el lado llamante. Este es el caso para cualquier método con parámetros out y no es específico para TryParse.

Las personas que lo codificaron eligieron default the parameter to zero cuando falla el análisis sintáctico.

La parte importante es que no se debe pensar que cualquier out métodos de parámetros honrarán el valor original del parámetro out cuando se pasa en De hecho, se puede Nunca de honor el parámetro como el compilador informará:.

uso de asignar a cabo parámetro 'bla'

Si intenta utilizar el valor del parámetro antes de asignar a la misma dentro del método. Por lo tanto, puede garantizar que cualquier valor que asigne y otorgue como un parámetro out se ignorará/sobrescribirá.

+0

Gracias, esto tiene mucho sentido ahora, aunque a primera vista es muy engañoso. – dtsg

+0

@Duane De hecho, puede ser, pero todo se deriva del uso de parámetros 'out', aparte del valor elegido como predeterminado, nada aquí es específico de' TryParse'. –

2

si no lo hará return false y el código de la sentencia if no será ejecutada.

En el caso de la conversión falla que también retun 0 por eso output=0

15

De MSDN:

Cuando regresa este método, contiene el valor entero de 32 bits equivalente al número que figura en el cadena, si la conversión tuvo éxito, o zero si la conversión falló.

2

En C#, out hay que asignar los parámetros y no se pueden leer inicialmente. (Cuando se inicia un método, los parámetros out se tratan como variables no inicializadas).

Por lo tanto, el valor anterior de output es irrelevante. Tuvo que ser sobreescrito por las personas que escribieron el método TryParse, de lo contrario no podría haber sido compilado.

Al mismo tiempo, el método TryParse no tiene acceso al valor anterior de output. Por lo tanto, se debe elegir algún valor. En este caso, the developers chose 0.

Cuestiones relacionadas