120 votes

Différence entre le casting et l'utilisation de la méthode Convert.To()

J'ai une fonction qui convertit un double en string valeurs.

string variable = "5.00"; 

double varDouble = (double)variable;

Un changement de code a été enregistré et le projet se construit avec l'erreur : System.InvalidCastException: Specified cast is not valid.

Cependant, après avoir fait ce qui suit...

string variable = "5.00"; 

double varDouble = Convert.ToDouble(variable);

...le projet se construit sans aucune erreur.

Quelle est la différence entre le moulage et l'utilisation de la Convert.To() méthode ? Pourquoi le moulage lance un Exception et en utilisant le Convert.To() ne le fait pas ?

4voto

Le moulage n'implique aucune conversion, c'est-à-dire que la représentation interne d'une valeur n'est pas modifiée. Exemple :

object o = "Hello"; // o is typed as object and contains a string.
string s = (string)o; // This works only if o really contains a string or null.

Vous pouvez convertir un double a string comme ceci

double d = 5;
string s = d.ToString(); // -> "5"

// Or by specifying a format
string formatted = d.ToString("N2"); // -> "5.00"

Vous pouvez convertir un string à un double de plusieurs façons (ici, seulement deux d'entre elles) :

string s = "5";
double d = Double.Parse(s); // Throws an exception if s does not contain a valid number

Ou le moyen le plus sûr

string s = "5";
double d;
if (Double.TryParse(s, out d)) {
    Console.WriteLine("OK. Result = {0}", d);
} else {
    Console.WriteLine("oops!");
}

2voto

Scott Hannen Points 11757

double varDouble = (double)variable suppose que variable est déjà un double. Si variable n'est pas un double (c'est une chaîne de caractères), l'opération échouera. double varDouble = Convert.ToDouble(variable) fait ce qu'il dit - il des convertisseurs. S'il peut analyser ou extraire un double à partir de variable alors elle le fera.

Je seconde l'utilisation de Double.Parse o Double.TryParse parce que ça indique plus clairement ce qui est censé se passer. Vous commencez avec une chaîne de caractères et vous vous attendez à ce qu'elle soit convertible en un double. En cas de doute, utilisez TryParse .

Si variable est un argument de méthode, changez le type en double. Rendez l'appelant responsable de la fourniture du type correct. De cette façon, le compilateur fait le travail pour vous.

1voto

Viktor S. Points 12026
string variable = "5.00";     
double varDouble = (double)variable;

La conversion ci-dessus n'est tout simplement pas autorisée par la langue. Voici une liste de conversions explicites pour les types numériques : http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx Comme vous pouvez le constater, tous les types numériques ne peuvent pas être convertis en un autre type numérique.

Quelques informations supplémentaires sur le casting ici

Et en quoi cela diffère-t-il de Convert.ToDouble() ?

Lorsque vous exprimez un type, la structure des données n'est pas modifiée. En revanche, dans le cas d'une conversion de valeurs numériques, vous pouvez perdre quelques bits ou obtenir quelques bits 0 supplémentaires. Mais vous travaillez toujours avec un nombre. Vous ne faites que changer la quantité de mémoire prise par ce nombre. C'est suffisamment sûr pour que le compilateur fasse tout ce qui est nécessaire.

Mais lorsque vous essayez de convertir une chaîne de caractères en un nombre, vous ne pouvez pas le faire car cela ne suffit pas à modifier la quantité de mémoire prise par la variable. Par exemple, 5.00 comme une chaîne de caractères est une séquence de "chiffres" : 53(5) 46(.) 48(0) 48(0) - c'est pour l'ASCII, mais une chaîne de caractères contiendra quelque chose de similaire. Si le compilateur ne prend que les N premiers octets (4 pour les doubles ? je ne suis pas sûr) d'une chaîne, ce morceau contiendra un nombre double complètement différent. Dans le même temps, Convert.ToDouble() exécute un algorithme spécial qui prend chaque symbole d'une chaîne, détermine le chiffre qu'il représente et crée un nombre double pour vous, si la chaîne représente un nombre. Des langages comme PHP vont, en gros, appeler Convert.ToDouble pour vous en arrière-plan. Mais C#, en tant que langage à typage statique, ne le fera pas pour vous. Cela vous permet d'être sûr que toute opération est sûre au niveau du type et que vous n'obtiendrez pas quelque chose d'inattendu en faisant quelque chose comme :

double d = (double)"zzzz"

1voto

Keen Points 1111

La conversion d'une chaîne de caractères en un double n'est pas autorisée en C#, c'est pourquoi vous obtenez une exception, vous devez convertir la chaîne de caractères ( Document MSDN qui montre les chemins de conversion acceptables). Cela s'explique par le fait qu'une chaîne de caractères ne contiendra pas nécessairement des données numériques, mais que les différents types numériques en contiendront (sauf les valeurs nulles). A Convert exécutera une méthode qui vérifiera la chaîne de caractères pour voir si elle peut être transformée en une valeur numérique. Si c'est le cas, elle renvoie cette valeur. Si ce n'est pas le cas, une exception sera levée.

Pour le convertir, vous avez plusieurs possibilités. Vous avez utilisé le Convert dans votre question, il y a Parse qui est largement similaire à Convert mais vous devriez aussi regarder TryParse ce qui vous permettrait de faire :

string variable = "5.00"; 

double varDouble;

if (Double.TryParse(variable, out varDouble)) {
    //Code that runs if the conversion succeeded.
} else {
    //Code that runs if the conversion failed.
}

Cela permet d'éviter une éventuelle exception si vous tentez de Convert o Parse une chaîne non numérique.

-1voto

TomHardy Points 99

La différence la plus importante est que si moulage de type est utilisé et la conversion échoue (disons que nous convertissons une très grande valeur de float en int) aucune exception ne sera levée et la valeur minimale qu'un int peut contenir sera affichée. Mais dans le cas de l'utilisation de Convertir Dans ce cas, une exception sera levée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X