2011-02-09 12 views
17

Una pregunta surgido en el trabajo hoy acerca de cómo convertir un objeto en su tipo determinado (un int), dije para su emisión:¿Por qué usar Convert.ToInt32 sobre el casting?

int i = (int)object; 

un colega dice que el uso Convert.ToInt32().

int i = Convert.ToInt32(object) 

¿Cuál es la diferencia entre Convert.ToInt32() y un elenco objeto directo?

Respuesta

16

No todos los objetos se pueden convertir directamente en int. Por ejemplo, lo siguiente no se compilará:

string s = "1"; 
int i = (int)s; 

porque string no es convertir implícitamente a int.

Sin embargo, esto es legal:

string s = "1"; 
int i = Convert.ToInt32(s); 

Como nota al margen, tanto fundición y Convert puede lanzar excepciones si el objeto de entrada no se puede convertir. Sin embargo, int.TryParse no tira si falla; más bien, devuelve falso (pero sólo se necesita en una cadena, así que hay que .ToString() el objeto de entrada antes de usarlo):

object s = "1"; 
int i; 
if(int.TryParse(s.ToString(), out i)) 
{ 
    // i now has a value of 1 
} 
+0

La palabra que está buscando está "explícitamente" en el segundo "párrafo" - implícita sería 'int i = s'. –

1

sólo se puede emitir cuando el tipo de original tiene un elenco definido para el nuevo tipo . Por lo tanto, normalmente es posible enviar de un tipo numérico a otro (por ejemplo, long to int), pero normalmente no es posible el envío de tipos no numéricos a tipos numéricos (por ejemplo, string to int). Convert proporciona muchos más métodos para cambiar estos tipos no numéricos a numéricos, por lo que la razón para usarlo es que es menos probable que obtenga un error.

0

Si sabe que la instancia enmarcada es una int, puede usar el operador de conversión (int) de manera segura para desempaquetarla. Sin embargo, si es convertible a int (por ejemplo, un flotante), el uso del operador de conversión fallará en tiempo de ejecución.

Consulte la documentación de la clase Convert para obtener más información sobre las conversiones específicas que permite o no.

1

Tiendo a preferir Convert solo porque proporciona una buena interfaz uniforme para la conversión. Por ejemplo, Convert.ToInt32("45") funciona pero (int)"45", no.

Convert también reportará problemas como arrojar un OverflowException. El lanzamiento puede ser peligroso, ya que el lanzamiento desde, por ejemplo, largo hasta un int puede dar lugar a un resultado pobre y el tiempo de ejecución no le dirá nada.

También me gusta que Convert.ToX(object obj) existe, lo que le permite simplemente disparar cosas a Convert y en su mayor parte olvidarse de ello.

+2

en su segunda declaración; lo que dijiste es cierto en el caso por defecto, pero podrías envolver el molde en un bloque "marcado", que lanzará una excepción ArithmeticOverflowException en tales casos. – KeithS

9

son fundamentalmente diferentes

Fundición dice que el objeto es una instancia del tipo de ser echado a, por lo lanzó.

Convert dice que hay una conversión entre los tipos que se convierten.

Así que, por ejemplo, no puede convertir una cadena en un int, pero puede convertirlo. Existe cierta zona gris/superposición debido a ciertas reglas de conversión incorporadas para tipos primitivos, o conversiones de conversión explícita que puede agregar a sus propios tipos. Pero generalmente no pensaría en estos dos como el equivalente.

Dado que no existe una opción 'mejor', debe usar la opción que tenga sentido en el contexto dado.

+8

Creo que es una cuestión de intenciones. Casting dice claramente "¡Sé que eres un' int'! " mientras que Convert dice "No tengo idea de lo que eres, pero eventualmente sé que serás un' int' " – Greg

+0

Sí, una forma muy agradable de explicarlo, gracias. –

0

La diferencia es Convert.ToInt32(object value) intentará usar IConvertible para convertir el valor a int donde como lanzamiento directo simplemente lanzará una excepción si tal conversión no es válida.

Las otras sobrecargas también intentan convertir y no fundición.

1

Convert.ToInt32 es básicamente el mismo que int.Parse Con una diferencia: si utiliza int.Parse (nulo) se produce una excepción, mientras que Convert.ToInt32 devuelve 0

casting por el contrario es una operación más compleja y solo funcionará si el valor es realmente un tipo de valor en caja int o anohter (boxed/unboxed) que se puede convertir implícitamente.

(boxeo es una representación de objeto de un tipo de valor)

1

Convert es una clase que contiene una serie de métodos estáticos y está suposed para ser utilizado para convertir tipos de bases, los tipos soportados son Boolean, Char, SByte , Byte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Simple, Doble, Decimal, DateTime y String. El operador de conversión le permite hacer lo mismo pero también puede usarlo para otros tipos, incluidos los tipos que cree. También puede definir estos operadores en sus clases, lo que le permite convertir de cualquier cosa a cualquier cosa. Así que esa es la diferencia, uno es un método y el otro es un operador, no he comprobado las agallas del operadoror al convertir e int a una cadena, pero podría tener la misma lógica que los métodos en Convertir.

Cuestiones relacionadas