2012-05-11 3 views
10

Quelle est la différence, le cas échéant?C# Coulée à une décimale

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

Répondre

8

Il n'y a pas de différence.Si vous regardez la source:

en décimal:

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

Dans Convert:

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

Donc à la fin, ils appellent tous new decimal(double).

+0

Mais il peut y avoir une différence entre '(valeur décimale) et' new decimal (valeur) ': la première invoque l'opérateur de conversion double-décimal intégré, tandis que la seconde invoque une surcharge du constructeur décimal. Certes, le code natif sera probablement le même, mais l'IL est probablement différent, et la sémantique C# est certainement différente. – phoog

+2

@phoog Il n'y a pas de différence entre les deux. Il n'y a pas d'opérateur de conversion double-à-décimal "intégré", la première méthode fournie dans la réponse est celle qui est appelée. La première façon que vous avez fournie appelle simplement la seconde manière dont vous avez fourni une méthode dans l'arborescence d'appel. – JKor

+0

@JKou je n'ai pas fourni de moyens; Je suis juste en train de commenter. – phoog

4

Tous obtiennent les mêmes résultats. Cependant, voici une explication plus dégradables:

  • Méthode 1 crée une nouvelle variable qui jette explicitement myDouble à taper decimal. Quand vous lancez, vous dites, "Cet objet de type A est vraiment un objet de type B-dérivé-de-A ou un opérateur de casting existe pour lancer A à B."

  • Méthode 2 crée une nouvelle variable qui permet de convertir myDouble au type approprié (decimal) par l'intermédiaire d'une surcharge de constructeur. Lorsque vous appelez un constructeur, vous dites "Créer un nouvel objet basé sur les arguments passés dans le constructeur."

  • Méthode 3 convertit un type de données de base (double) à un autre type de données de base (decimal). Lorsque vous utilisez quelque chose comme Convert.ToDecimal(), vous dites, "Cet objet n'est pas de type B, mais il existe un moyen de le transformer en un objet de type B."

En ce qui concerne Convert MSDN déclare:

  • Une méthode de conversion existe pour convertir tous les types de base à tout autre type de base. Cependant, l'opération de conversion proprement dite se répartit en trois catégories:

  • Une conversion d'un type à elle-même renvoie simplement ce type. Aucune conversion n'est réellement effectuée.

  • Une conversion qui ne peut pas générer de résultat significatif génère InvalidCastException. Aucune conversion n'est réellement effectuée. Une exception est générée pour les conversions de Char à Boolean, Single, Double, Decimal ou DateTime et de ces types à Char. Une exception est générée pour les conversions de DateTime à tout type sauf String, et de n'importe quel type, sauf String, à DateTime. Tout type de base, autre que ceux décrits ci-dessus, peut être converti vers et à partir de tout autre type de base.
+0

L'exemple 2 montre une surcharge du constructeur. De plus, l'exemple de cast de l'exemple 1 n'est pas un cast selon votre définition, car bien sûr, decimal ne dérive pas du double (ni l'inverse). Au lieu de cela, l'opérateur de conversion C# a deux fonctions: (1) la transposition de types de référence préservant la représentation et (2) l'invocation de conversions explicites (ou implicites) intégrées ou définies par l'utilisateur. – phoog

3

En fait, il n'y a aucune différence du point de vue fonctionnel. Ce sont des façons différentes à atteindre le même résultat. Il est important de spécifier que dans le cas de Convert.ToDecimal, vous avez la possibilité de spécifier un format IFormatProvider (culture), afin d'obtenir plus de flexibilité.

Si vous ne vous souciez pas de l'environnement multiculturel, choisissez l'un d'entre eux que vous aimez.

+1

Je suppose que le IFormatProvider est ignoré ici, car ni l'entrée ni la sortie n'est une chaîne. – phoog

+0

oui, c'est correct. La remarque portait sur la différence d'utilisation générale possible – Tigran