Conversions entre nombres et chaînes de caractères en C#

19 Nov
2009

Pour commencer, précisons que C# ne permet pas (contrairement à VB) des conversions implicites avec perte de précision. Par contre, C# autorise les conversions implicites si le type destinataire peut s’accomodé de toutes les valeurs du type source. Ceci est appelé une “widening conversion”.

Voici un exemple de “widening conversion” :

int i = 1;

double d = 1.000001;

d = i ; // convertion OK

Si le type source à un range et une précision plus grande que celle du destinataire on parle alors de “norrowing conversion”. Ceci requiert une conversion explicite. Ce type de conversion est source d’erreur si la valeur source dépasse le range du type destinataire. Dans ce cas, si la conversion entre ces types n’est pas définie, vous recevrez une erreur de compilation.

Autre type de casting donc, le norrowing conversion :

double d = 1.000001;

int i = 1;

i = int (d);

Boxing : C’est convertir un type valeur (int, double, float,…) en un type référence. Ci-dessous nous convertissons un int (type valeur) en un objet (type référence).

int i = 124;

object o = (object) i ;

UnBoxing : C’est convertir un type objet en un type valeur. Convertir un objet en int.

object o = 123;

int i = (int)o;

La pratique du Boxing et de l’Unboxing est assez coûteux en performance et vous devriez éviter de l’utiliser trop souvent à l’intérieur de tâches répétitives. Le boxing intervient également lorsque l’on appele une méthode virtuel d’une structure ou d’un type valeur qui hérite de System.Objet, comme ToString(). Les conseils suivant évitent les boxing non-nécessaires

  • Implémenter des méthodes spécifiques par type que nous voulons utiliser. Ceci est utile lorsque cette méthode doit être capable d’interpréter plusieurs types de valeurs.
  • Utiliser les génériques plutôt que de coder à partir du system.object.
  • Override les méthodes ToString, Equals, GetHash virtual lorsque l’on définit une structure.

Comment implémenter la conversion pour un type personnalisé ?

  • Définir les opérateurs de convesion pour simplifier le narrowing  (perte de taille et précision) et le widening (augmentation de la taille et de la précision) entre les types numériques.
  • Override la méthode ToString pour définir les conversions vers le type string. Override la méthode Parse pour les conversions depuis string.
  • Implémentez System.IConvertible pour permettre la conversion à travers System.Convert. Utilisez cette technique pour définir la conversion spécique aux cultures.
  • Implémentez une classe TypeConverter qui permet la conversion lors du design-time pour utiliser les propriétés window de Visual Studio.

Vous pouvez également définir les opérations implicit et explicit pour vos classes personnalisées, de cette manière vous autoriserez le casting (widening et narrowing) pour vos classes.

Voici un exemple d’implémentation de casting pour une classe personnalisée :

customstruccasting

Et l’implémentation :

customstruccastingapp

J’espère que ses explications vous serviront à mieux comprendre les conversions en C#. Si vous avez des remarques, n’hésitez-pas à m’en faire part.

Comment Form

top