Parse v. TryParse

111

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

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

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

¿Existe alguna forma de verificación de errores como un bloque Try-Catch?

Kredns
fuente

Respuestas:

155

Parsearroja una excepción si no puede analizar el valor, mientras que TryParsedevuelve un que boolindica si tuvo éxito.

TryParseno solo try/ catchinternamente, el punto es que se implementa sin excepciones para que sea rápido. De hecho, la forma más probable de implementarlo es que internamente el Parsemétodo llamará TryParsey luego lanzará una excepción si regresa false.

En pocas palabras, utilícelo Parsesi está seguro de que el valor será válido; de lo contrario utilizar TryParse.

Greg Beech
fuente
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 central a TryParse ...
Joel Coehoorn
4
@Joel: asumí que habrían movido la implementación, pero acabo de echar un vistazo con el reflector y son implementaciones separadas con exactamente el mismo código que uno tiene 'lanzar ...' y uno tiene 'devolver falso'. ¡¿Me pregunto por qué no están consolidados ?!
Greg Beech
6
Aunque, pensándolo bien, Parse arroja una serie de excepciones diferentes, por lo que si todo lo que tuviera fuera un bool de TryParse, entonces no sabría cuál lanzar.
Greg Beech
5
"use Parse si está seguro de que el valor será válido". Yo agregaría, "pero reconoces la posibilidad de que estés equivocado". Si estuviera 100% seguro de que puede analizar, entonces podría usar TryParse correctamente, que podría ser más rápido.
Jon
2
Y por "diferentes excepciones", @GregBeech se refiere al mensaje, no a la clase.
Paul Draper
26

Si la cadena no se puede convertir a un número entero, entonces

  • int.Parse() lanzará una excepción
  • int.TryParse() devolverá falso (pero no lanzará una excepción)
M4N
fuente
¿Qué pasa si uso int.TryParse (some_method_that_throws_exception (), out int test)? ¿Detectará alguna excepción o solo las relacionadas con el análisis?
Alexandru Antochi
@AlexandruAntochi No debe hacer una pregunta como comentario. Esto hará que sea casi imposible que otros se beneficien de respuestas útiles. Sin embargo, para que valga la pena, la respuesta a su pregunta es no, int. TryParse no arrojará nada. Si el método no puede analizar, solo lo reflejará con un valor de retorno falso. Esto hace que sea conveniente usar if (int.TryParse ... para hacer algo solo si el análisis tiene éxito.
Rob
3

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

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

Ray Booysen
fuente
Pasar nulo a tipos básicos (int, double, DateTime, etc.) NO arrojará una excepción
Dr. Yunke
3

TryParse y el impuesto de excepción

Parse lanza una excepción si falla la conversión de una cadena al tipo de datos especificado, mientras que TryParse evita explícitamente lanzar una excepción.

Gulzar Nazim
fuente
TryParse lanzará una excepción si pasa nulo para la mayoría de los métodos TryParse integrales.
Ray Booysen
1
Gran enlace. Me sorprende que nadie aún no haya iniciado el debate sobre "cuál es la mejor o qué práctica de codificación se debe aplicar".
Christian Madsen
0

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

Mark Brittingham
fuente
6
TryParse devuelve el valor a través del parámetro dos que se especifica con la palabra clave out.
Christian Madsen
0

Para que conste, estoy probando dos códigos: que simplemente intentan convertir de una cadena a un número y, si falla, asignan 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 usar tryparse porque la alternativa try & Catch lanzó la excepción

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

Que es doloroso lento e indeseable, sin embargo, el código no se detiene a menos que la excepción de Debug se establezca para detenerse con él.

magallanes
fuente
El primer fragmento de código no hace nada, ya que tmpint ya se establecerá en cero si la cadena no se puede analizar como un int.
Andrew Neely
0

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

Tuve un escenario en el que DateTime debe convertirse a String y si datevalue null o string.empty nos enfrentamos a una excepción. Para superar esto, hemos reemplazado 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 usarla como Salida para TryParse.

La vida de Pi
fuente
No necesita inicializar startDatey endDatecomo DateTime.TryParsesiempre los sobrescribirá con DateTime.MinValue. Si las representaciones de fecha incorrectas deben convertirse a un valor diferente, verifique el valor de retorno de DateTime.TryParsey si es falso, establezca el valor explícitamente.
Palec
Usando DateTime?( DateTime anulable )
Kiquenet
-1

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

eyaler
fuente
4
¿Pero TryParsevuelve trueo false? Así sabrá si era "válido".
Paul Draper