c# - toint32 - Lo que es mejor: int.TryParse o try{int.Parse()} catch
int.tryparse c# ejemplo (9)
¡El primero! No debe codificar por excepción.
podrías acortarlo a
if (int.TryParse(string, out num))
Lo sé ... Lo sé ... El rendimiento no es la principal preocupación aquí, pero solo por curiosidad, ¿qué es mejor?
bool parsed = int.TryParse(string, out num);
if (parsed)
...
O
try {
int.Parse(string);
}
catch () {
do something...
}
¿Es excepcional que la conversión a veces falle, o se espera y es normal que la conversión a veces falle? Si el primero, use una excepción . Si es este último, evite las excepciones . Las excepciones se llaman "excepciones" por una razón; solo debe usarlos para manejar circunstancias excepcionales .
Atrapar una excepción tiene más sobrecarga, así que iré a TryParse.
Además, el método TryParse no arroja una excepción si la conversión falla. Elimina la necesidad de utilizar el manejo de excepciones para probar una FormatException en el caso de que s no sea válida y no pueda ser analizada con éxito.
Esa última parte copiada desde here
El primero. El segundo se considera codificación por excepción .
Otra cosa a tener en cuenta es que las excepciones se registran (opcionalmente) en la ventana de depuración / salida de Visual Studio. Incluso cuando la sobrecarga de rendimiento de las excepciones puede ser insignificante, escribir una línea de texto para cada excepción cuando la depuración puede ralentizar las cosas. Más excepciones dignas de mención podrían ser ahogadas entre todo el ruido de las operaciones de análisis de enteros fallidos, también.
Personalmente, preferiría:
if (int.TryParse(string, out num))
{
...
}
Primero, de lejos. Como dijo George, el segundo es codificar por excepción y tiene un gran impacto en el rendimiento. Y el rendimiento debería ser una preocupación, siempre.
Si de hecho se espera que la conversión a veces falle, me gusta usar int.TryParse
y de forma int.TryParse
en una línea con el operador condicional (Ternary) , así:
int myInt = int.TryParse(myString, out myInt) ? myInt : 0;
En este caso, cero se usará como valor predeterminado si falla el método TryParse.
También es realmente útil para tipos anulables, que sobrescribirá cualquier valor predeterminado con null
si la conversión falla.
Mejor es altamente subjetivo. Por ejemplo, personalmente prefiero int.TryParse
, ya que a menudo no me importa por qué falla el análisis, si falla. Sin embargo, int.Parse
puede (de acuerdo con la documentation ) arrojar tres excepciones diferentes:
- la entrada es nula
- la entrada no está en un formato válido
- la entrada contiene un número que provoca un desbordamiento
Si te importa por qué falla, entonces int.Parse
es claramente la mejor opción.
Como siempre, el contexto es el rey.