2009-01-22 21 views
91

¿Cuál es la diferencia entre Parse() y TryParse()?Parse v. TryParse

int number = int.Parse(textBoxNumber.Text); 

// The Try-Parse Method 
int.TryParse(textBoxNumber.Text, out number); 

¿Hay alguna forma de comprobación de errores como un bloque Try-Catch?

Respuesta

129

Parse arroja una excepción si no puede analizar el valor, mientras que TryParse devuelve un bool indicando si tuvo éxito.

TryParse no solo try/catch internamente: el objetivo es que se implementa sin excepciones para que sea rápido. De hecho, la forma más probable de implementarlo es que internamente el método Parse llamará al TryParse y luego lanzará una excepción si devuelve false.

En pocas palabras, use Parse si está seguro de que el valor será válido; de lo contrario, use TryParse.

+1

"internamente, el método Parse llamará a TryParse" Excepto que Parse es anterior a TryParse en varias versiones. Por supuesto, podrían haber movido la implementación del núcleo a TryParse ... –

+4

@Joel - Supuse que habrían movido la implementación, pero acabo de echar un vistazo con reflector y son implementaciones separadas con * exactamente * el mismo código que no sea uno tiene 'throw ...' y uno tiene 'return false'. Me pregunto por qué no están consolidados? –

+5

Aunque, pensando en ello, Parse arroja una serie de excepciones diferentes, así que si todo lo que tenía era un bool de TryParse, entonces no sabría cuál lanzar. –

20

Si la cadena no se puede convertir en un entero, entonces

  • int.Parse() lanzará una excepción
  • int.TryParse() devolverá falso (pero no lanzar una excepción)
3

El método TryParse le permite comprobar si algo es parseable. Si prueba Parse como en la primera instancia con un int no válido, obtendrá una excepción mientras está en el TryParse, devuelve un booleano que le permite saber si el análisis tuvo éxito o no.

Como nota al pie, al pasar nulo a la mayoría de los métodos TryParse lanzaremos una excepción.

0

TryParse no devuelve el valor, devuelve un código de estado para indicar si el análisis se realizó correctamente (y no arroja una excepción).

+4

TryParse devuelve el valor a través del parámetro dos que se especifica con la palabra clave out. –

+0

@Christian Madsen - Gracias. –

2

TryParse and the Exception Tax

Analizar una excepción si la conversión de una cadena en el tipo de datos especificado falla, mientras que TryParse explícitamente Evita lanzar una excepción.

+0

TryParse lanzará una excepción si pasa nulo para la mayoría de los métodos integrales de TryParse. –

+1

Gran enlace. Me sorprende que nadie haya comenzado aún la discusión sobre "cuál es el mejor o qué práctica de codificación debería aplicarse". –

-2

double.Parse ("-"); genera una excepción, mientras que double.TryParse ("-", out analizado); analiza al 0 , así que supongo que TryParse realiza conversiones más complejas.

+4

¿Pero 'TryParse' devuelve' true' o 'false'? Así es como sabrá si fue "válido". –

0

Para el registro, estoy probando dos códigos: que simplemente intenta convertir de una cadena a un número y si falla, asigne el número a cero.

 if (!Int32.TryParse(txt,out tmpint)) { 
      tmpint = 0; 
     } 

y:

 try { 
      tmpint = Convert.ToInt32(txt); 
     } catch (Exception) { 
      tmpint = 0; 
     } 

para C#, la mejor opción es utilizar TryParse porque tratan alternativa & Catch produce la excepción

A first chance exception of type 'System.FormatException' occurred in mscorlib.dll 

que es doloroso lento y no deseable, sin embargo , el código no se detiene a menos que se resuelva la excepción de Debug para detenerse con él.

+0

El primer snippit de código no hace nada, ya que tmpint ya se establecerá en cero si la cadena no se puede analizar como un int. –

0

Sé que es una publicación muy antigua, pero pensé en compartir algunos detalles más sobre Parse vs TryParse.

Tuve un escenario donde DateTime debe convertirse a String y si datevalue null o string.empty estamos frente a una excepción. Para superar esto, hemos reemplazado a Parse con TryParse y obtendremos la fecha predeterminada.

Código antiguo:

dTest[i].StartDate = DateTime.Parse(StartDate).ToString("MM/dd/yyyy"); 
dTest[i].EndDate = DateTime.Parse(EndDate).ToString("MM/dd/yyyy"); 

Nuevo Código:

DateTime startDate = default(DateTime); 
DateTime endDate=default(DateTime); 
DateTime.TryParse(dPolicyPaidHistories[i].StartDate, out startDate); 
DateTime.TryParse(dPolicyPaidHistories[i].EndDate, out endDate); 

tiene que declarar otra variable y se utiliza como salida para TryParse.

+0

No necesita inicializar 'startDate' y' endDate' como ['DateTime.TryParse'] (https://msdn.microsoft.com/en-us/library/ch92fbc1 (v = vs.110) .aspx) siempre los sobreescribirá con 'DateTime.MinValue'. Si las representaciones de fecha incorrectas se deben convertir a un valor diferente, verifique el valor de retorno de 'DateTime.TryParse' y si es falso, establezca el valor explícitamente. – Palec

+0

Usando 'DateTime?' (** DateTime nullable **) – Kiquenet