Consommation de types

publicitemcppreparation

 

L’un des avantages qu’offre Visual Studio est que pendant la rédaction du code, il vérifie automatiquement les types de toutes les expressions.

Cela vous permet d’avoir en temps réel les remontées d’erreurs liées au code. Par exemple, lorsque vous souhaitez stocker un type dans un autre (tel qu’une String dans un Int).

Convertir un type en un autre est parfois nécessaire en C#.

Dans ce billet, j’explique :

  • Le Boxing et Unboxing pour convertir les types valeurs.
  • La conversion entre différents types.

Le Boxing et Unboxing

En C#, il existe 3 types :

  • Types valeurs : Ce sont des variables qui contiennent directement des valeurs. Ils héritent implicitement de System.ValueType. Ils sont répartis en 2 catégories : Les structures (types numériques, bool,…) et les énumérations.
  • Types références : Ils font références à leurs données (objets). Par exemple, les classes, interfaces…
  • Types pointeurs (rarement utilisés en C#).

L’importante différence entre un type valeur et référence est que le type valeur contient directement sa valeur tandis que le type référence pointe vers un objet.

Le Boxing consiste à prendre un type valeur, le mettre dans un objet et stocker sa référence dans le tas.

En revanche, le Unboxing récupère l’élément du tas et retourne sa valeur sous forme de type valeur.

Dans le cas d’une exécution invalide d’Unbox, le runtime renvoit une InvalidCastException

La conversion entre différents types

Le choix sur les types de variables est très important en C# car une fois déclarée, une variable ne peut donc plus être redéclarée ou utilisée pour stocker des valeurs d’un autre type.

Cela dit, il est possible dans certains cas de forcer le changement du type de variable en utilisant une conversion de types. Par exemple un int en double.

Il existe 4 conversions de types :

  • Implicite
  • Explicite
  • Définie par l’utilisateur
  • Via une classe d’assistance (helper).

La conversion implicite

Aucune syntaxe particulière n’est requise. Elle s’exécute parce que le compilateur sait que la conversion est autorisée et sécurisée.

Par exemple une variable de type long peut stocker toute valeur qu’int peut stocker.

int num = 2147483647;

long bigNum = num;

La conversion explicite

Le compilateur nous empêche d’effectuer une conversion implicite si elle ne peut pas être faite sans risque de pertes d’informations.

Dans ce cas, pour forcer la conversion, il faut informer le compilateur que vous êtes au courant de ce risque et que malgré cela, la conversion doit avoir lieu.

Cette conversion explicite est appelée cast et nécessite une syntaxe particulière.

double x = 1234.7;       

int a;       

// Cast double to int.       

a = (int)x;

La conversion définie par l’utilisateur

Lorsque vous créez vos propres types, vous pouvez y ajouter des conversions explicite et implicite sous forme de méthodes spéciales.

La conversion via une classe d’assistance (Helper).

Le .NET Framework offre également des classes d’assistances pour convertir les types.

Nous avons par exemple les méthodes Parse() ou TryParse().

Vérification de la validité d’une conversion

En C#, il est possible de vérifier si un type peut être convertible ou pas avant d’effectuer la conversion.

Pour ce faire, les opérateur « is » et « as » peuvent être utilisés pour effectuer cette vérification.

L’opérateur « is » renvoie true or false en fonction de la possibilité de la conversion.

L’opérateur « as » retourne soit la valeur convertit ou null si la conversion est impossible.

L’opérateur « as » est à utiliser lorsque vous souhaitez exploiter la valeur retournée par la suite.

Exceptions de conversion de type au moment de l’exécution

Il est possible qu’une opération cast dont la compilation fonctionne échoue au moment de l’exécution. Cela peut se produire sur certaines conversions de types référence.

Dans ce cas, l’exécution provoquera la levée d’une InvalidCastException.

Publicités