2008-09-19 15 views
12

Noté en otro post, alguien había hecho algo como:System.Convert.ToInt vs (int)

double d = 3.1415; 
int i = Convert.ToInt32(Math.Floor(d)); 

¿Por qué usan la función de conversión, en lugar de:

double d = 3.1415; 
int i = (int)d; 

cuales tiene un piso implícito y convierte.

También, más preocupante, me di cuenta de algún código de producción que estaba leyendo:

double d = 3.1415; 
float f = Convert.ToSingle(d); 

¿Eso es lo mismo que:

float f = (float)d; 

Son todas aquellas conversiones de otro modo implícitas solo en la clase Convert para completar, o sirven para un propósito? Puedo entender la necesidad de .ToString(), pero no el resto.

Respuesta

12

Conversión a int es el truncamiento implícita, no suelo implícita:

double d = -3.14; 
int i = (int)d; 
// i == -3 

elijo Math.floor o Math.Round para hacer mis intenciones más explícito.

1

Puede utilizar Convert cuando se tiene una cadena que desea convertir a un Convert int

int i = Convert.ToInt32("1234"); 

y la fundición será tanto una excepción si fallan.

es decir, el mismo será una excepción, no retornará 0:

Convert.ToInt32("1234NonNumber"); 

En muchos casos, convertir y fundición tendrá el mismo resultado, pero un reparto es a menudo más fácil de leer.

+0

¿No 'Int32.Parse (String): Int32' en realidad convierte una cadena en un int? –

+0

Int32.Parse convertirá una cadena "numérica" ​​en un int y arrojará una excepción si la conversión falla. Int32.TryParse devolverá falso si la conversión falla mientras se convierte.ToInt32 devolverá 0 si la conversión falla. –

1

Convert.ToInt32() se utiliza en cadenas (http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx) mientras que la conversión solo se puede usar en tipos que tienen convertidores internos (tipos numéricos). El verdadero truco es decidir entre Int32.Parse y Convert.ToInt32(). Convert.ToInt32() es tolerante a un parámetro nulo y devuelve 0 mientras Int32.Parse() arrojará una ArgumentNullException.

3

redondeo también se controla de forma diferente:

x = -2,5 (int) x = -2 Convert.ToInt32 (x) = - 2
x = -1,5 (int) x = -1 Convert. ToInt32 (x) = - 2
x = -0,5 (int) x = 0 Convert.ToInt32 (x) = 0
x = 0,5 (int) x = 0 Convert.ToInt32 (x) = 0
x = 1,5 (int) x = 1 Convert.ToInt32 (x) = 2
x = 2,5 (int) x = 2 Convert.ToInt32 (x) = 2

No tice x = -1.5 y x = 1.5 casos.
En algunos algoritmos, el método de redondeo utilizado es fundamental para obtener la respuesta correcta.