Frédéric Mélantois
C# 3.0 Beta, déclarations et initialisations simplifiées, regardons sous le capot !
Puisque le produit est encore en beta, portons un regard sur quelques nouveautés du langage et ce qui peut être généré par le compilateur c#.
Par Frédéric Mélantois publié le 25/06/2007 à 00:52, lu 4727 fois, 8 pages
 3 | Type implicite
Lorsque vous définissez une variable locale, vous précisez dans la partie gauche de la déclaration le type de la variable. Généralement, comme vous initialisez aussitôt la variable, l'initialisation se trouvant sur la partie droite est aussi typée. Il y a une sorte de redondance dans l'écriture. Il apparaît évident que la partie droite de la déclaration est suffisante pour définir le type de la variable. C# 3.0 évolue dans la simplification de l'écriture en remplaçant le typage de la partie gauche de la déclaration-initialisation par le mot clé « var ». La simplification d'écriture n'est pas la raison réelle puisque celle-ci aurait pu intervenir dès C# 2.0. Après en avoir parlé autour de moi, les raisons pourraient être par exemple que l'usage de la bibliothèque Linq introduit des définitions de type très compliquées contenant des génériques. Mais la raison la plus indispensable est de pouvoir référencer les types anonymes nouvellement introduit dans C# 3.0. Ces derniers feront l'objet d'un prochain article mais en attendant, pour plus d'information, je vous invite à consulter les différents liens proposés en conclusion du présent article. Ainsi, le compilateur c# prend désormais en charge la déduction du type de la variable en fonction de la valeur immédiatement affectée. La syntaxe suivante :

int t = 5;

peut s'écrire :

var t = 5;

On peut évidemment se demander si le code IL varie. La réponse est non comme le montre l'exemple d'une initialisation de variable dans la méthode Main d'une application Console :

.method private hidebysig static void  Main(string[] args) cil managed

  {

    .entrypoint // point d'entrée du programme

    .maxstack  1 // la pile d'évaluation de la méthode contient 1 seul élément au maximum

    .locals init ([0] int32 t)  // définition de la variable locale t

    IL_0001:  ldc.i4.5  // chargement de la valeur 5 dans la pile

    IL_0002:  stloc.0  // déchargement de la pile, la valeur 5 est affectée à la variable t

    IL_0003:  ldloca.s   t  // chargement dans la pile de l'adresse de t

    IL_0005:  call       instance string [mscorlib]System.Int32::ToString()

    IL_000a:  call       void [mscorlib]System.Console::WriteLine(string)

    IL_0010:  call       string [mscorlib]System.Console::ReadLine()

    IL_0015:  pop

    IL_0016:  ret

  }

Pour les deux syntaxes de déclaration et d'initialisation de variables ci-dessus, le code IL est strictement le même. Les non-initiés à l'IL pourront le vérifier via l'utilitaire Reflector. Le code renvoyé par celui-ci en ayant écrit notre code avec le mot clé « var » est le suivant :

int t = 5;

Si vous vous amusez à réaliser quelques déclarations et initialisations de variables locales via le mot clé « var », vous vous apercevrez très vite que l'équipe en charge de « l'IntelliSense » dans Visual Studio a réalisé de véritables prouesses !
 
/content/f4e62165-4fd8-44cb-9394-f126278221d8/inferencetypeIntellissence.jpg
 
Sans qu'il soit nécessaire de compiler, Visual Studio est en mesure de déduire le type d'une variable à partir d'une expression qui peut être très complexe. Cette faculté sert énormément lors de l'usage du requettage Linq. L'implémentation des types implicites va jusqu'à la possibilité de gérer les pointeurs et même dans l'usage des boucles « for » et « foreach » comme en témoigne le code ci-dessous :

unsafe

{

    var p = stackalloc int[100];

 

    var cpt = 0;

 

    do

    {

        *p = cpt;

        p++;

    }

    while (cpt++ < 99);

    p -= 100;

 

    for (var i = 0; i < 100; i++)

        Console.WriteLine(p[i]);

}

 
» Démarrer une discussion
 
Discussion démarée par Malkuth le 24/07/2007 à 03:11, 2 commentaire(s).
Discussion démarée par vjacquet le 25/06/2007 à 17:42, 4 commentaire(s).