Inférence de type

Inférence de type et mot-clé var

Observez le code ci-dessous. Le type indiqué au début de chaque déclaration de variable peut être déterminé automatiquement par le compilateur à partir de la valeur d’initialisation située à droite du signe égal. Par exemple, peut-il déduire que 18 est un entier int et que Phone() renvoie un objet de type Phone ?

static void Main( )
{
    int age = 18; // La valeur 18 à droite est directement inférée comme int
    Phone p = new Phone(); // Le constructeur à droite retourne une instance Phone
}
Langage du code : C# (cs)

Peut-on donc simplifier le code ci-dessus ?

C# propose le mot-clé var pour alléger la syntaxe et remplacer les déclarations de type explicites.

static void Main( )
{
    var age = 18;
    var p = new Phone();
}
Langage du code : JavaScript (javascript)

Ici, toutes les variables à gauche utilisent var. Le compilateur déduit le bon type grâce à l’expression de droite. Après compilation, les deux extraits de code sont identiques.

Remarques importantes

  1. var n’est pas un type dynamique. Ce n’est qu’un sucre syntaxique. Le compilateur fixe le type inféré à la compilation, celui-ci ne peut plus être modifié par la suite ; les deux portions de code ont exactement le même comportement.
  2. Règles impératives pour utiliser var :
    • Il ne fonctionne que pour les variables locales, pas pour les champs d’une classe
    • Il faut obligatoirement affecter une valeur initiale lors de la déclaration. Écrire seulement var x; est invalide
    • Le type déduit reste figé ; on ne peut pas stocker des données d’un autre type dans la variable ensuite
  3. Distinction essentielle : le var de C# ≠ le var de JavaScript. Le var de JavaScript correspond à un typage faible et dynamique, autorisant une variable à stocker n’importe quel type. Le var de C# n’est qu’un raccourci dans un langage à typage statique fort, sans changer les caractéristiques du langage.

Autrement dit, pendant la compilation, le compilateur utilise la partie droite pour déterminer que age est de type int et p de type Phone. Le résultat final correspond exactement au premier code.

On ne peut pas modifier leurs types après coup. Voici un exemple :

class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();
    }
}

class Phone
{
    public string Name { get; set; }
}Langage du code : C# (cs)

Cette notation provoque une erreur en C#, mais d’autres langages comme JavaScript ou PHP l’autorisent : ils permettent de changer le type des variables librement.

JavaScript et PHP sont des langages à typage faible et dynamique ; leurs variables ne sont pas contraintes à un type fixe.

Exemple incorrect


class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();

        var isBuy;
    }
}

class Phone
{
    var price = 1000;
    var model = "iPhone";

    int count = 12;
}Langage du code : C# (cs)

Inférence de type

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *