C# Conversion de type
En C#, la conversion de type est le processus consistant à convertir une valeur d'un type de données vers un autre type de données.
La conversion de type en C# peut être divisée en deux types :conversion de type impliciteetconversion de type explicite(également appelée conversion de type forcée).
Conversion de type implicite
La conversion implicite est une conversion qui ne nécessite pas d'écrire du code pour la spécifier ; le compilateur l'effectue automatiquement.
La conversion implicite désigne le fait que lors de la conversion d'un type de données de plus petite plage vers un type de données de plus grande plage, le compilateur effectue automatiquement la conversion de type. Ces conversions sont des conversions par défaut de C# effectuées de manière sûre et n'entraînent pas de perte de données.
Par exemple, de int à long, de float à double, etc.
Conversion d'un petit type entier vers un grand type entier, ou d'une classe dérivée vers une classe de base. Lorsqu'on affecte une variable de type byte à une variable de type int, le compilateur convertit automatiquement le type byte en type int sans nécessiter de conversion explicite.
Exemple
int i = b; // Conversion implicite, aucune conversion explicite nécessaire
Affecter un entier à un entier long, ou affecter un nombre à virgule flottante à un nombre à virgule flottante à double précision, ce type de conversion n'entraîne pas de perte de données :
Exemple
long longValue = intValue; // Conversion implicite de int à long
Conversion explicite
La conversion de type explicite, également appelée conversion de type forcée, nécessite que le programmeur la spécifie explicitement dans le code.
La conversion explicite désigne le fait que lors de la conversion d'un type de données de plus grande plage vers un type de données de plus petite plage, ou de la conversion d'un type d'objet vers un autre type d'objet, un opérateur de transtypage est requis pour une conversion explicite. La conversion forcée peut entraîner une perte de données.
Par exemple, affecter une variable de type int à une variable de type byte nécessite une conversion explicite.
Exemple
byte b = (byte)i; // Conversion explicite, nécessite un opérateur de transtypage
Conversion vers un type entier :
Exemple
int intValue = (int)doubleValue; // Conversion forcée de double en int ; les données peuvent perdre la partie fractionnaire
Conversion vers un type à virgule flottante :
Exemple
float floatValue = (float)intValue; // Conversion forcée d'int en float, les données peuvent perdre de la précision
Conversion vers un type chaîne :
Exemple
string stringValue = intValue.ToString(); // Convertir int en string
L'exemple suivant illustre une conversion de type explicite :
Exemple
namespace TypeConversionApplication
{
class ExplicitConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
// Convertir double en int
i = (int)d;
Console.WriteLine(i);
Console.ReadKey();
}
}
}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
5673
Méthodes de conversion de type C#
C# fournit les méthodes de conversion de type intégrées suivantes :
| Numéro de série | Metode & Deskripsi |
|---|---|
| 1 | ToBoolean Convertir un type en une valeur booléenne si possible. |
| 2 | To Convertit un type en un type byte. |
| 3 | ToChar Convertir un type en un type caractère Unicode unique si possible. |
| 4 | ToDateTime Convertit un type (type entier ou chaîne) en une structure date-heure. |
| 5 | ToDecimal Convertir un type à virgule flottante ou entier en un type décimal. |
| 6 | ToDouble Convertit un type en un type à virgule flottante à double précision. |
| 7 | ToInt16 Convertit un type en type entier 16 bits. |
| 8 | ToInt32 Convertit un type en type entier 32 bits. |
| 9 | ToInt64 Convertit un type en type entier 64 bits. |
| 10 | ToSbyte Convertit un type en type octet signé. |
| 11 | ToSingle Convertit un type en type à virgule flottante simple précision. |
| 12 | ToString Convertit un type en type chaîne. |
| 13 | ToType Convertit un type en un type spécifié. |
| 14 | ToUInt16 Convertit un type en un type entier non signé de 16 bits. |
| 15 | ToUInt32 Convertit un type en un type entier non signé de 32 bits. |
| 16 | ToUInt64 Convertit un type en un type entier non signé de 64 bits. |
Ces méthodes sont toutes définies dans la classe System.Convert, et vous devez inclure l'espace de noms System lorsque vous les utilisez. Elles offrent un moyen sûr d'effectuer une conversion de type, car elles peuvent gérer les valeurs null et lèvent une exception si la conversion n'est pas possible.
Par exemple, en utilisant la méthode Convert.ToInt32 pour convertir une chaîne en entier :
string str = "123"; int number = Convert.ToInt32(str); // 转换成功,number为123
Si la chaîne n'est pas une représentation valide d'un entier, Convert.ToInt32 lèvera une FormatException.
L'exemple suivant convertit des types de valeurs différentes en types string :
Exemple
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
// Définir une variable entière
int i = 75;
// Définir une variable à virgule flottante
float f = 53.005f;
// Définir une variable à virgule flottante en double précision
double d = 2345.7652;
// Définir une variable booléenne
bool b = true;
// Convertir une variable entière en chaîne de caractères et l'afficher
Console.WriteLine(i.ToString());
// Convertir une variable à virgule flottante en chaîne de caractères et l'afficher
Console.WriteLine(f.ToString());
// Convertir la variable à virgule flottante en double précision en chaîne de caractères et l'afficher
Console.WriteLine(d.ToString());
// Convertir une variable booléenne en chaîne de caractères et l'afficher
Console.WriteLine(b.ToString());
// Attendre que l'utilisateur appuie sur une touche avant de fermer la fenêtre de console
Console.ReadKey();
}
}
}
Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :
75 53.005 2345.7652 True
Lors d'une conversion de type, les points suivants doivent être pris en compte :
- La conversion implicite ne peut convertir qu'un type de données ayant une plage plus petite vers un type de données ayant une plage plus grande, et ne peut pas convertir un type de données ayant une plage plus grande vers un type de données ayant une plage plus petite;
- La conversion explicite peut entraîner une perte de données ou une précision réduite, donc des contrôles de compatibilité des types de données sont nécessaires ;
- Pour la conversion de type d'objet, des contrôles de compatibilité pour la conversion de type et des contrôles de sécurité pour la conversion de type sont nécessaires.
Méthodes de conversion de type
C# fournit diverses méthodes de conversion de type, telles que la classe Convert, la méthode Parse et la méthode TryParse, qui peuvent aider à gérer les conversions entre différents types de données.
Utilisation de la classe Convert
La classe Convert fournit un ensemble de méthodes statiques qui peuvent convertir entre divers types de données de base.
Exemple
int num = Convert.ToInt32(str);
Utilisation de la méthode Parse
La méthode Parse est utilisée pour convertir une chaîne au type numérique correspondant, et elle lève une exception si la conversion échoue.
Exemple
double d = double.Parse(str);
Utilisation de la méthode TryParse
La méthode TryParse est similaire à Parse, mais elle ne lève pas d'exception ; à la place, elle retourne une valeur booléenne indiquant si la conversion a réussi.
Exemple
double d;
bool success = double.TryParse(str, out d);
if (success) {
Console.WriteLine("Conversion réussie : " + d);
} else {
Console.WriteLine("Échec de la conversion");
}
Conversion de type personnalisée
C# vous permet également de définir des opérations de conversion de type personnalisées en définissant le mot-clé implicit ou explicit dans un type.
Exemple
public class Fahrenheit
{
public double Degrees { get; set; }
public Fahrenheit(double degrees)
{
Degrees = degrees;
}
// Conversion implicite de Fahrenheit en double
public static implicit operator double(Fahrenheit f)
{
return f.Degrees;
}
// Conversion explicite de double en Fahrenheit
public static explicit operator Fahrenheit(double d)
{
return new Fahrenheit(d);
}
}
public class Program
{
public static void Main()
{
Fahrenheit f = new Fahrenheit(98.6);
Console.WriteLine("Objet Fahrenheit : " + f.Degrees + " degrés");
double temp = f; // Conversion implicite
Console.WriteLine("Après conversion implicite en double : " + temp + " degrés");
Fahrenheit newF = (Fahrenheit)temp; // Conversion explicite
Console.WriteLine("Après conversion explicite vers Fahrenheit : " + newF.Degrés + " degrés");
}
}
Dans l'exemple ci-dessus, nous avons défini une classe Fahrenheit et implémenté une conversion implicite de Fahrenheit vers double et une conversion explicite de double vers Fahrenheit.
Le résultat de sortie s'affichera comme suit :
Fahrenheit object: 98.6 degrees After implicit conversion to double: 98.6 degrees After explicit conversion back to Fahrenheit: 98.6 degrees
Résumé
En C#, les méthodes de conversion de type intégrées sont principalement mises en œuvre des manières suivantes : conversion implicite, conversion explicite (conversion forcée), méthodes utilisant la classe Convert, la méthode Parse et la méthode TryParse. Ces méthodes sont largement utilisées pour la conversion entre différents types de données.
Le tableau suivant présente les méthodes de conversion de type intégrées de C# :
| Catégorie de méthode | Méthodes | Description |
|---|---|---|
| Conversion implicite | Conversion automatique | Aucune spécification explicite n'est requise ; elle est généralement utilisée pour des conversions de type sûres, comme d'un type plus petit vers un type plus grand. |
| Conversion explicite (cast) | (type)value | Une spécification explicite est requise ; elle est généralement utilisée dans les cas pouvant entraîner une perte de données ou un échec de conversion. |
ConvertMéthodes de classe | Convert.ToBoolean(value) | Convertit le type spécifié enBoolean |
Convert.ToByte(value) | Convertit le type spécifié enByte | |
Convert.ToChar(value) | Convertit le type spécifié enChar | |
Convert.ToDateTime(value) | Convertit le type spécifié enDateTime | |
Convert.ToDecimal(value) | Convertit le type spécifié enDecimal | |
Convert.ToDouble(value) | Convertit le type spécifié enDouble | |
Convert.ToInt16(value) | Convertit le type spécifié enInt16(entier court) | |
Convert.ToInt32(value) | Convertit le type spécifié enInt32(entier) | |
Convert.ToInt64(value) | Convertit le type spécifié enInt64(entier long) | |
Convert.ToSByte(value) | Convertit le type spécifié enSByte | |
Convert.ToSingle(value) | Convertit le type spécifié enSingle(type à virgule flottante simple précision) | |
Convert.ToString(value) | Convertit le type spécifié enString | |
Convert.ToUInt16(value) | Convertit le type spécifié enUInt16(type entier court non signé) | |
Convert.ToUInt32(value) | Convertit le type spécifié enUInt32(entier non signé) | |
Convert.ToUInt64(value) | Convertit le type spécifié enUInt64(type entier long non signé) | |
ParseMéthodes | Boolean.Parse(string) | Analyser la chaîne commeBoolean |
Byte.Parse(string) | Analyser la chaîne commeByte | |
Char.Parse(string) | Analyser la chaîne commeChar | |
DateTime.Parse(string) | Analyser la chaîne commeDateTime | |
Decimal.Parse(string) | Analyser la chaîne commeDecimal | |
Double.Parse(string) | Analyser la chaîne commeDouble | |
Int16.Parse(string) | Analyser la chaîne commeInt16 | |
Int32.Parse(string) | Analyser la chaîne commeInt32 | |
Int64.Parse(string) | Analyser la chaîne commeInt64 | |
SByte.Parse(string) | Analyser la chaîne commeSByte | |
Single.Parse(string) | Analyser la chaîne commeSingle | |
UInt16.Parse(string) | Analyser la chaîne commeUInt16 | |
UInt32.Parse(string) | Analyser la chaîne commeUInt32 | |
UInt64.Parse(string) | Analyser la chaîne commeUInt64 | |
TryParseMéthodes | Boolean.TryParse(string, out bool) | Essayer d'analyser la chaîne commeBoolean, renvoie une valeur booléenne indiquant si elle a réussi |
Byte.TryParse(string, out byte) | Essayer d'analyser la chaîne commeByte, renvoie une valeur booléenne indiquant si elle a réussi | |
Char.TryParse(string, out char) | Essayer d'analyser la chaîne commeChar, renvoie une valeur booléenne indiquant si elle a réussi | |
DateTime.TryParse(string, out DateTime) | Essayer d'analyser la chaîne commeDateTime, renvoie une valeur booléenne indiquant si elle a réussi | |
Decimal.TryParse(string, out decimal) | Essayer d'analyser la chaîne commeDecimal, renvoie une valeur booléenne indiquant si elle a réussi | |
Double.TryParse(string, out double) | Essayer d'analyser la chaîne commeDouble, renvoie une valeur booléenne indiquant si elle a réussi | |
Int16.TryParse(string, out short) | Essayer d'analyser la chaîne commeInt16, renvoie une valeur booléenne indiquant si elle a réussi | |
Int32.TryParse(string, out int) | Essayer d'analyser la chaîne commeInt32, renvoie une valeur booléenne indiquant si elle a réussi | |
Int64.TryParse(string, out long) | Essayer d'analyser la chaîne commeInt64, renvoie une valeur booléenne indiquant si elle a réussi | |
SByte.TryParse(string, out sbyte) | Essayer d'analyser la chaîne commeSByte, renvoie une valeur booléenne indiquant si elle a réussi | |
Single.TryParse(string, out float) | Essayer d'analyser la chaîne commeSingle, renvoie une valeur booléenne indiquant si elle a réussi | |
UInt16.TryParse(string, out ushort) | Essayer d'analyser la chaîne commeUInt16, renvoie une valeur booléenne indiquant si elle a réussi | |
UInt32.TryParse(string, out uint) | Essayer d'analyser la chaîne commeUInt32, renvoie une valeur booléenne indiquant si elle a réussi | |
UInt64.TryParse(string, out ulong) | Essayer d'analyser la chaîne commeUInt64, renvoie une valeur booléenne indiquant si elle a réussi |