Qual è la differenza tra?C# Casting to a decimal
decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
Qual è la differenza tra?C# Casting to a decimal
decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
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)
.
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:
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.
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
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.
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
@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
@JKo non ho fornito alcun modo; Sto solo commentando – phoog