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);
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);
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)
.
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.
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
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.
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
@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
@JKou je n'ai pas fourni de moyens; Je suis juste en train de commenter. – phoog