2011-10-05 14 views
7

Digamos que quiero convertir un doble x en un decimal y. Hay mucho de maneras de hacer eso:Convertir tipos numéricos: ¿Qué estilo usar?

1. var y = Convert.ToDecimal(x); // Dim y = Convert.ToDecimal(x) 
2. var y = new Decimal(x);   // Dim y = new Decimal(x) 
3. var y = (decimal)x;    // Dim y = CType(x, Decimal) 
4. -- no C# equivalent --   // Dim y = CDec(x) 

Funcionalmente, todo lo anterior hacen lo mismo (por lo que puedo decir). Además del gusto y estilo personal, ¿hay alguna razón particular para elegir una opción sobre la otra?

EDITAR: Este es el IL generado mediante la compilación de las tres opciones de C# en una configuración de salida:

1. call valuetype [mscorlib]System.Decimal [mscorlib]System.Convert::ToDecimal(float64) 
    --> which calls System.Decimal::op_Explicit(float64) 
     --> which calls System.Decimal::.ctor(float64) 
2. newobj instance void [mscorlib]System.Decimal::.ctor(float64) 
3. call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Explicit(float64) 
    --> which calls System.Decimal::.ctor(float64) 

Este es el IL generado mediante la compilación de las cuatro opciones de VB en una configuración de salida:

1. call valuetype [mscorlib]System.Decimal [mscorlib]System.Convert::ToDecimal(float64) 
    --> which calls System.Decimal::op_Explicit(float64) 
     --> which calls System.Decimal::.ctor(float64) 
2. call instance void [mscorlib]System.Decimal::.ctor(float64) 
3. newobj instance void [mscorlib]System.Decimal::.ctor(float64) 
4. newobj instance void [mscorlib]System.Decimal::.ctor(float64) 

por lo tanto, todo termina en System.Decimal::.ctor(float64)

+0

¿Por casualidad para comprobar que codifican IL se genera? –

+0

Necesita cambiar CType a DirectCast para que sea equivalente. – AMissico

+0

@AMissico: No, DirectCast no realiza conversiones. Con DirectCast, ni siquiera se compilará si x se escribe estáticamente en Doble. – Heinzi

Respuesta

4

Convert.ToInt32() aplica el redondeo a números reales durante la conversión a int solo elimina la parte fraccionaria. En mi opinión, el método de conversión de "conversiones" depende demasiado de la magia de .NET framework. Si sabe que tendrá lugar una conversión, describirla explícitamente es la más fácil de entender. Me gustaría ir por la opción Convert para la mayoría de los casos, a menos que no se necesite una conversión y el yeso simplemente funciona.

6

sospecharía que el uso de los cas unarios El operador ting le daría al compilador una mejor oportunidad de optimizar, pero yo baso esto en absolutamente nada.

+6

+1 por honestidad: P – Polynomial

1

Con tipos de datos de origen no objeto y no de cadena, prefiero los moldes. Conciso y fácil de leer.

Para los tipos de fuente de objeto y cadena, depende de la fuente. Por ejemplo, si la fuente proviene del usuario, entonces utilizo los métodos Convertir/Conversión.

Recomiendo descargar el código fuente de .NET en "Microsoft Reference Source Code Center" (http://referencesource.microsoft.com). Consulte Convert.cs, Converstion.vb y Conversions.vb. Anteriormente usaría los métodos Convertir/Conversión en todos los casos, pero después de revisar estos archivos fuente, mi preferencia son las versiones.

Tomando su ejemplo y haciendo referencia a Convert.ToDecimal() Convert.cs, la llamada es en realidad un molde simple:

public static decimal ToDecimal(double value) { 
     return (decimal)value; 
    } 
Cuestiones relacionadas