2012-05-11 13 views
10

¿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); 

Respuesta

8

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.

+0

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

+2

@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

+0

@JKor No proporcioné ninguna manera; Solo estoy comentando. – phoog

4

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

método
  • 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.

  • Una conversión que no puede producir un resultado significativo arroja InvalidCastException. No se realiza ninguna conversión. Se genera una excepción para las conversiones de Char a Boolean, Single, Double, Decimal o DateTime, y de esos tipos a Char. Se lanza una excepción para las conversiones de DateTime a cualquier tipo, excepto String, y de cualquier tipo, excepto String, a DateTime. Cualquier tipo base, distinto de los descritos anteriormente, se puede convertir ay desde cualquier otro tipo de base.
+0

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

3

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.

+1

Supongo que el IFormatProvider se ignora aquí, porque ni la entrada ni la salida son cadenas. – phoog

+0

sí, correcto. La nota era sobre la posible diferencia general de uso – Tigran