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)
¿Por casualidad para comprobar que codifican IL se genera? –
Necesita cambiar CType a DirectCast para que sea equivalente. – AMissico
@AMissico: No, DirectCast no realiza conversiones. Con DirectCast, ni siquiera se compilará si x se escribe estáticamente en Doble. – Heinzi