Conversions de types en C#
Apprenez les conversions de types en C#, y compris le casting implicite et explicite, Parse, TryParse et Convert avec exemples.
Lors de la programmation, nous travaillons avec différents types de données. Les données saisies par l’utilisateur sont généralement de type string,
mais pour effectuer des opérations mathématiques, elles doivent être converties en types numériques.
C’est à ce moment que les conversions de types interviennent.
Dans cet article, nous allons examiner les méthodes de conversion de types en C#.
Conversion implicite et explicite (Casting)
La conversion d’un type de données plus petit vers un type plus grand est effectuée automatiquement par conversion implicite. En revanche, pour convertir d’un type plus grand vers un type plus petit, il existe un risque de perte de données ; il faut donc utiliser une conversion explicite.
// Conversion implicite
int nombre = 100;
long grand = nombre; // conversion automatique
double reel = nombre; // int → double
// Conversion explicite
double d = 12.9;
int i = (int)d; // 12, la partie décimale est perdue
byte b = (byte)300; // 300 est trop grand pour un byte → débordement
Console.WriteLine(b); // 44
Conversions avec la classe Convert
La classe Convert permet d’effectuer des conversions sûres entre les types les plus courants.
string s1 = "42";
int nombre = Convert.ToInt32(s1);
string s2 = "3.14";
double pi = Convert.ToDouble(s2);
bool etat = Convert.ToBoolean(1); // true
string texte = Convert.ToString(12345);
Console.WriteLine(nombre);
Console.WriteLine(pi);
Console.WriteLine(etat);
Console.WriteLine(texte);
Méthodes Parse et TryParse
Parse lève une exception en cas de saisie incorrecte, tandis que TryParse renvoie false si la conversion échoue.
Exemples avec Parse :
int i = int.Parse("123");
double d = double.Parse("12.5");
decimal prix = decimal.Parse("99.99");
bool b = bool.Parse("true");
Console.WriteLine(i);
Console.WriteLine(d);
Console.WriteLine(prix);
Console.WriteLine(b);
Exemple avec TryParse :
Console.Write("Entrez un nombre : ");
string saisie = Console.ReadLine();
if (int.TryParse(saisie, out int resultat))
{
Console.WriteLine("Vous avez saisi : " + resultat);
}
else
{
Console.WriteLine("Nombre invalide.");
}
Boxing et Unboxing
L’encapsulation des types valeur dans un object s’appelle boxing,
et leur extraction s’appelle unboxing.
int x = 10;
// Boxing
object obj = x;
// Unboxing
int y = (int)obj;
Console.WriteLine(y);
// Unboxing incorrect provoque une erreur
object obj2 = "texte";
// int z = (int)obj2; // InvalidCastException
Contrôle et opérateurs de conversion de type
Les opérateurs is, as ainsi que les méthodes GetType et typeof peuvent être utilisés pour vérifier les types.
object donnees = "Bonjour";
// opérateur is
if (donnees is string)
Console.WriteLine("Les données sont de type string.");
// opérateur as
string str = donnees as string;
if (str != null)
Console.WriteLine(str.ToUpper());
// GetType et typeof
Console.WriteLine(donnees.GetType()); // System.String
Console.WriteLine(typeof(int)); // System.Int32
Application Exemple
Demandons des informations sur un produit à l’utilisateur en tant que chaînes et convertissons-les dans les types appropriés.
Console.Write("Nom du produit : ");
string produit = Console.ReadLine();
Console.Write("Quantité : ");
string quantiteStr = Console.ReadLine();
Console.Write("Prix unitaire : ");
string prixStr = Console.ReadLine();
Console.Write("Remise (%) : ");
string remiseStr = Console.ReadLine();
Console.Write("En stock ? (O/N) : ");
string stockStr = Console.ReadLine();
if (int.TryParse(quantiteStr, out int quantite) &&
decimal.TryParse(prixStr, out decimal prix) &&
double.TryParse(remiseStr, out double remise))
{
bool enStock = stockStr.Trim().ToUpper() == "O";
decimal total = quantite * prix;
decimal montantRemise = total * (decimal)(remise / 100);
decimal totalGeneral = total - montantRemise;
Console.WriteLine($"\nProduit : {produit}");
Console.WriteLine($"Quantité : {quantite}");
Console.WriteLine($"Prix unitaire : {prix:0.00} EUR");
Console.WriteLine($"Remise : %{remise}");
Console.WriteLine($"Stock : {(enStock ? "Disponible" : "Non disponible")}");
Console.WriteLine($"Total : {totalGeneral:0.00} EUR");
}
else
{
Console.WriteLine("Saisie invalide.");
}