¿Cuál es la diferencia si la hay?C# Casting a un decimal
decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
¿Cuál es la diferencia si la hay?C# Casting a un decimal
decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
No hay diferencia.Si nos fijamos en la fuente:
en decimal:
public static explicit operator decimal(double value)
{
return new decimal(value);
}
En Convert:
public static decimal ToDecimal(float value)
{
return (decimal) value;
}
Así que al final todos ellos new decimal(double)
llamada.
Todos logran los mismos resultados. Sin embargo, he aquí una explicación más desglosado:
Método 1 crea una nueva variable que arroja explícitamente myDouble
para escribir decimal
. Cuando lanzas, estás diciendo, "Este objeto de tipo A es realmente un objeto de tipo B derivado de A o existe un operador de conversión para convertir A a B".
Método 2 crea una nueva variable que convertirá myDouble
al tipo apropiado (decimal
) a través de una sobrecarga de constructor. Cuando invocas un constructor, estás diciendo, "Crea un nuevo objeto basado en los argumentos pasados al constructor".
Método 3 convierte un tipo de datos base (double
) a otro tipo de datos base (decimal
). Cuando utiliza algo como Convert.ToDecimal()
, está diciendo, "Este objeto no es de tipo B, pero existe una forma de convertirlo en un objeto de tipo B".
En cuanto Convert
MSDN establece: existe
A de conversión para convertir cada tipo de base a cualquier otro tipo base. Sin embargo, la operación de conversión real realizada se divide en tres categorías:
Una conversión de un tipo a sí misma simplemente devuelve ese tipo. No se realiza ninguna conversión.
El ejemplo 2 muestra una sobrecarga del constructor. Además, el ejemplo del elenco en el ejemplo 1 no es un elenco de acuerdo con su definición, porque por supuesto el decimal no deriva del doble (ni al revés). Por el contrario, el operador de conversión de C# tiene dos funciones: (1) conversión de tipo de referencia de preservación de la representación de tipos de referencia e (2) invocación de conversiones explícitas (o implícitas) incorporadas o definidas por el usuario. – phoog
No hay ninguna diferencia, en realidad, desde el punto de vista funcional. Estas son formas diferentes de lograr el mismo resultado.
Es importante tener en cuenta que en el caso de Convert.ToDecimal, tiene la posibilidad de especificar un formato IFormatProvider (cultura), para que gane más flexibilidad.
Si no te importa el entorno multicultural, elige cualquiera de ellas que te guste.
Pero podría haber una diferencia entre '(decimal) value' y' new decimal (value) ': la primera invoca el operador de conversión de doble a decimal incorporado, mientras que la segunda invoca una sobrecarga del constructor decimal. De acuerdo, el código nativo probablemente será el mismo, pero el IL probablemente sea diferente, y la semántica de C# es ciertamente diferente. – phoog
@phoog No hay diferencia entre los dos. No hay un operador de conversión doble a decimal "integrado", el primer método proporcionado en la respuesta es el que se llama. La primera forma que proporcionó solo llama a la segunda forma en que proporcionó un método en el árbol de llamadas. – JKor
@JKor No proporcioné ninguna manera; Solo estoy comentando. – phoog