2010-05-27 9 views

Respuesta

9

Go read this ("Performance Profiling Parse vs. TryParse vs. ConvertTo") para mucha información adicional.

Si no está seguro si la cadena es analizable, entonces int.TryParse() será MUCHO más rápido que cualquiera de los otros y atrapará las excepciones.

0

Tanto int.Parse y Convert.Int32 llaman internamente int.TryParse, por lo que las diferencias de rendimiento entre ellos, deben ser trivial. TryParse es el más versátil ya que le permite decidir si lanzar o no una excepción, pero de lo contrario no hay diferencia entre estos métodos.

+2

En realidad, si echa un vistazo en Reflector, int.Parse llama a Number.ParseInt32 internamente ... nunca llama a int.TryParse. –

+0

Estaba pensando lo mismo. Estaba a punto de abrir un código fuente, pero tomaré su información como confirmación. – Jaxidian

0

Convert.ToInt32 (cadena) llama a Int32.Parse (cadena).

Sin embargo, si usa Int32.Parse (o su equivalente interno), puede especificar la globalización y el formato utilizados al analizar.

Int.Parse será más rápido ya que no hace una prueba/captura.

Int.TryParse es más confiable y no arrojará un error si no le pasa un valor no convertible.

+0

En realidad, si echa un vistazo en Reflector, int.Parse llama a Number.ParseInt32 internamente ... nunca llama int.TryParse –

+1

@Ed: ¿Quién dice que TryParse debe implementarse en términos de Parse, y no al revés ? –

+1

Esto contradice en cierto modo lo que está escrito en el punto de referencia referenciado por Jaxidian. 'int.Parse' no será más rápido según eso. –

1

Yo personalmente uso

int.Parse(...) 

si tengo una cadena como una fuente y

Convert.ToInt32(...) 

si tengo un valueType (doble, decimal) como fuente, porque de lo contrario tenía que emitir a cuerdas y tratar con la cultura local.

+1

Utilizo 'int.Parse' si quiero que se genere una excepción en una cadena que estoy analizando (es decir, una API que espera un número de página o algo así como un parámetro querystring). Yo uso 'int.TryParse' en una cadena que estoy analizando si quiero manejarlo en ese mismo momento. Yo uso 'Convert.ToInt32' si no es una cadena (ya sea un decimal, un int boxed en un objeto, o lo que sea). Así que estoy en la página contigo. :-) – Jaxidian

5

Convert.Int32() llama Int32.Parse() con una comprobación adicional para nula, por lo que Int32.Parse() podría ser un poco más rápido. por lo que Convert.Int32() será más rápido (atrapa el nulo antes de que Int32.Parse() tenga que ocuparse de ello).

Int32.Parse() llama internamente al Number.ParseInt32() que arroja Excepciones cuando no se puede analizar un número.

Int32.TryParse() llamadas internas Number.TryParseInt32() que tienen un código similar a Number.ParseInt32() pero en lugar de arrojar Excepciones, simplemente devuelve falso ... lo que introduce menos sobrecarga.

Teniendo en cuenta todas esas variables, supongo que Int32.TryParse() le dará los resultados más rápidos para valores no nulos. Si existe la posibilidad de que la mayoría de las llamadas contengan nulos, yo diría que Convert.Int32() funcionaría mejor.

... todo eso traído a usted por el poder de .NET Reflector.

+0

+1, pero con respecto a "para que Int32.Parse() pueda ser un poco más rápido": supongo que no podrá medir la verificación nula. De hecho, será más lento si su entrada es 'nula' de acuerdo con http://blogs.msdn.com/b/ianhu/archive/2005/12/19/505702.aspx:" La diferencia es, como ya lo intuimos, en el código de manejo de excepciones. Es por eso que Convert fue más rápido que Parse ya que Convert maneja la cadena nula en el conjunto de datos incorrecto sin lanzar una excepción ". –

+0

@ 0xA3 Actualicé mi respuesta para reflejar el comentario. Gracias por la captura (y referencia). –

0

Me parece que la respuesta depende del contexto.

Si estoy convirtiendo (por ejemplo) un DataRow a un objeto, voy a tener un montón de Convert.ToXXX llamadas, por lo que me gustaría utilizar Convert.ToInt32 ya que es consistente con las otras declaraciones en torno a que la conversión.

En otras situaciones, si quiero lanzar una excepción cuando la cadena no analiza (fail-fast) Voy a usar int.Parse, debido a que produce la excepción para mí, y int.TryParse tiende a generar código más feo (I' nunca he sido fan de los parámetros)

Y si solo quiero especificar algún valor predeterminado si la cadena no analiza, usaré int.TryParse, porque de lo contrario, tendré que manejar la excepción yo mismo, y eso es caro y feo.

Sin embargo, a menos que llames al sitio de análisis miles de millones de veces, me sorprendería ver una diferencia de tiempo discernible entre cualquiera de los tres formatos, así que preferiría un código más legible, en lugar de una variante marginalmente más rápida .

Cuestiones relacionadas