2012-05-11 27 views
10

Qual è la differenza tra?C# Casting to a decimal

decimal d = (decimal) myDouble; 
decimal d = new decimal(myDouble); 
decimal d = Convert.ToDecimal(myDouble); 

risposta

8

Non c'è differenza.Se si guarda alla fonte:

in decimale:

public static explicit operator decimal(double value) 
{ 
    return new decimal(value); 
}  

In Converti:

public static decimal ToDecimal(float value) 
{ 
    return (decimal) value; 
} 

Così, alla fine, tutte le chiamate new decimal(double).

+0

Ma potrebbe esserci una differenza tra '(valore decimale)' e' nuovo decimale (valore) ': il primo richiama l'operatore di conversione da doppia a decimale incorporato, mentre il secondo richiama un sovraccarico del costruttore decimale. Certo, il codice nativo sarà probabilmente lo stesso, ma l'IL è probabilmente diverso, e la semantica C# è sicuramente diversa. – phoog

+2

@phoog Non c'è differenza tra i due. Non esiste un operatore di conversione "double-to-decimal" incorporato, il primo metodo fornito nella risposta è quello che viene chiamato. Il primo modo che hai fornito chiama semplicemente il secondo modo in cui hai fornito un metodo lungo l'albero delle chiamate. – JKor

+0

@JKo non ho fornito alcun modo; Sto solo commentando – phoog

4

Tutti ottenere gli stessi risultati. Tuttavia, ecco una spiegazione più ripartito:

  • Metodo 1 crea una nuova variabile che getta esplicitamente myDouble digitare decimal. Quando lanci, stai dicendo, "Questo oggetto di tipo A è in realtà un oggetto di tipo B derivato da A o esiste un operatore di cast per trasmettere A a B."

  • Metodo 2 crea una nuova variabile che converte myDouble al tipo appropriato (decimal) tramite un sovraccarico del costruttore. Quando invochi un costruttore, stai dicendo, "Crea un nuovo oggetto basato sugli argomenti passati nel costruttore."

  • Metodo 3 converte un tipo di dati di base (double) ad un altro tipo di dati di base (decimal). Quando si utilizza qualcosa come Convert.ToDecimal(), che stai dicendo, "Questo oggetto non è di tipo B, ma esiste un modo per farne un oggetto di tipo B."

Riguardo Convert MSDN afferma:

metodo
  • Una conversione esiste per convertire ogni tipo di base ad ogni altro tipo di base. Tuttavia, l'operazione di conversione effettiva eseguita rientra in tre categorie:

  • Una conversione da un tipo a se stesso restituisce semplicemente quel tipo. Nessuna conversione viene effettivamente eseguita.

  • Una conversione, che non può produrre un risultato significativo genera InvalidCastException. Nessuna conversione viene effettivamente eseguita. Viene generata un'eccezione per le conversioni da Char a Boolean, Single, Double, Decimal o DateTime e da quei tipi a Char. Viene generata un'eccezione per le conversioni da DateTime a qualsiasi tipo tranne String e da qualsiasi tipo, ad eccezione di String, a DateTime. Qualsiasi tipo di base, diverso da quelli sopra descritti, può essere convertito in e da qualsiasi altro tipo di base.
+0

L'esempio 2 mostra un sovraccarico del costruttore. Inoltre, l'esempio di cast nell'esempio 1 non è un cast secondo la tua definizione, perché ovviamente il decimale non deriva dal doppio (né viceversa). Piuttosto, l'operatore di cast di C# ha due funzioni: (1) casting di tipi di riferimento che preservano la rappresentazione e (2) invocano conversioni esplicite (o implicite) incorporate o definite dall'utente. – phoog

3

Non c'è alcuna differenza, in realtà, dal punto di vista funzionale. Questi sono diversi modi per raggiungere lo stesso risultato.

Importante per la gestione che in caso di Convert.ToDecimal, è possibile specificare un formato IFormatProvider (cultura), in modo da ottenere maggiore flessibilità.

Se non si preoccupano dell'ambiente multicultura, scegliere qualcuno di loro che ti piace.

+1

Suppongo che IFormatProvider sia ignorato qui, perché né l'input né l'output sono una stringa. – phoog

+0

sì, corretto. La nota riguardava la possibile differenza generale di utilizzo – Tigran