Nouveautés du Langage C# 4

La version 3.5 SP1 est à peine sortie que Microsoft prévoit déjà la prochaine version du langage C#. Cette fois en version 4. Une première version publique à été publiée dans une CTP (community technology preview) pour permettre d’appréhender l’avenir du langage.

C# 4

La ligne directrice pour C# 4 est une programmation dynamique. Les objets sont « dynamiques » dans le sens où leur structure et leur comportement ne sont pas cloisonnés par un type statique et que le compilateur sais comment compiler le programme. Quelques exemples :

  • Les objets d’un langage de programmation dynamique tel que Python ou Ruby.
  • Les objets COM auxquels on accède depuis IDispatch.
  • Les types .Net auxquels on accède à travers la réflexion.
  • Les objets avec une structure changeante, comme les objets DOM HTML.

C# reste un langage fortement typé statique, cependant les équipes de développement souhaitent augmenter l’interaction avec les objets et faire évoluer ensemble C# et Visual Basic. Elles veulent maintenir les caractéristiques de chaque langage, mais avoir toutes les nouveautés introduites dans les 2 langages en même temps. Si les langages sont différents dans le style, ils ne le sont pas dans les fonctionnalités.

Les nouvelles fonctionnalités en C# 4 peuvent être découpées en 4 groupes.

  • Dynamic lookup
  • Paramètres nommés et optionnels
  • COM
  • Variance

Ici nous verrons les deux premiers en détail.

Dynamic Lookup

Le Dynamic Lookup permet d’écrire des méthodes, des opérateurs et des appels d’indexeur, des propriétés et des champs internes. L’invocation de l’objet ne passe pas par le vérificateur de type de C# mais est résolu au runtime. Cela permet d’avoir une approche unifiée dans l’invocation dynamique.
C# 4 introduit un nouveau type fortement typé appelé « dynamic » . Quand vous aurez un objet de type « dynamic » vous pourrez avoir des éléments résolus seulement au runtime :

Dynamic d = GetDynamicObject(…) ;
d.M(7) ;

Le compilateur C# autorise l’appel d’une méthode avec n’importe quel nom et argument.
Au runtime l’objet d va être examiné pour « appeler la méthode M avec un int en paramètre ».
Le type dynamic peut être vu comme une version spéciale du type object.
Grâce à cela, tout objet peut être implicitement converti en « dynamic »

dynamic  d = 7 ; // conversion implicite
int i = d ; // conversion affectation

Dynamics operations

Ce n'est pas seulement l’appel des méthodes qui peut être invoqué dynamiquement. Les champs et les propriétés, les indexeurs et les opérateurs et même l'invocation des délégués peuvent être invoqués dynamiquement.

Dynamic d = GetDynamicObject(…) ;
d.M(7) ; // Appel de méthode
d.f = d.P ; // Getter et Setter , champs et propriétés
d[‘one’ ] = d[‘two’] ; // Getter et Setter d’indexeurs
int i = d + 3; // Appel d’opérateurs
string s = d(5,7) ; // invocation de delegate.

Ici, le rôle du compilateur C# est simplement de fournir les informations nécessaires : « Que peut faire d ». Ensuite le runtime peut déterminer exactement le comportement de l’objet d. Le résultat d’une opération dynamique sera du type « dynamic ».

COM objects

Si d est un objet COM, l’opération est dispatchée dynamiquement via le IDispatch COM. Ceci permet l’appel de type COM qui n'est pas un PIA (Primary Interop Assembly) et permet de combler les lacunes qui n’ont pas d’équivalent en C# comme les propriétés indexeurs et les propriétés par défaut.

Dynamics objects

Si l’objet d implémente l’interface IDynamicObject , c’est d qui demandera l’appel de l’opération. Grâce à l’interface on peut complètement redéfinir le comportement des opérations dynamiques.
Ceci est utilisé intensivement par les langages dynamiques comme IronPython et IronRuby pour implémenter leur propre modèle objet dynamique.

DLR

Le DLR ou Dynamic Language Runtime, qui est une nouvelle API, est un composant important dans l’implémentation de C# 4. Il fournit l’infrastructure pour C# et Dynamic lookup mais également l’implémentation de langage dynamique en .net comme IronRuby. Un haut niveau d’interopérabilité est assuré. Mais le plus important, c'est que le DLR met à disposition un mécanisme de cache pour assurer l’exécution du runtime.

Cependant il y a quelques limitations :

  • Le DLR permet aux objets d’être créés à partir d’objets représentants une classe. Actuellement l’implémentation de C# ne possède pas de syntaxe qui supporte cela.
  • Le Dynamic Lookup ne sera pas capable de trouver les méthodes d’extension (voir Article sur C# 3).
  • Les fonctions anonymes (ou expression lambdas) ne pourront pas apparaître comme arguments d’une méthode d’extension.

Une conséquence de ses limitations est que vous ne pourrez pas utiliser facilement les requêtes LINQ sur des objets dynamiques.

Named and Optional Arguments

Les paramètres nommés et optionnels sont deux fonctionnalités distinctes, mais ils sont souvent utilisés ensemble. Le paramètre optionnel permet d’omettre un argument à l’invocation d’une méthode.
Beaucoup D’API COM comme Office Automation sont écrites avec des paramètres nommés et optionnels. Il peut être très contraignant d’appeler des API en C#, car il faut poser explicitement les arguments et ceux-ci sont souvent des valeurs par défaut et peuvent donc être omis.
Paramètres optionnels :
Un paramètre est déclaré optionnel simplement en lui affectant une valeur par défaut.

Public void M(int x, int y = 5, int z = 7);

Ici y et z sont des paramètres optionnels et peuvent être omis lors de l’appel.

M(1,2,3) ; // Appel ordinaire de M
M(1,2) ; // Appel équivalent à M(1,2,7)
M(1) ; // Appel équivalent à M(1,5,7)

Paramètre nommé et optionnel

C# 4 ne permet pas d’omettre un paramètre comme dans ce cas M(1,,3) . Ceci rendrait le code illisible. A la place, on passera par les arguments nommés. Si vous voulez omettre seulement le paramètre y en appelant M on pourra écrire :

M(1, z : 3) ; // en passant z par son nom
M(x : 1, z :3) ;// en passant x et z par leur nom
M(z : 3, x : 1) ;// cette écriture autorise le passage dans n’importe quel ordre.

Les paramètres nommés et optionnels peuvent être utilisés non seulement avec des méthodes mais aussi avec les indexeurs et les constructeurs.

3 commentaires

  1. Autant les params optionnels et nommés sont une bonne nouvelle, autant le type dynamic est une porte largement ouverte sur des polémiques sans fin !
    Enfin… personne ne sera forcé d’utiliser une si dangereuse syntaxe…

  2. You could certainly see your enthusiasm within the paintings you write. The arena hopes for more passionate writers like you who aren’t afraid to mention how they believe. Always follow your heart.

  3. You could certainly see your enthusiasm within the paintings you write. The arena hopes for more passionate writers like you who aren’t afraid to mention how they believe. Always follow your heart.

Laisser un commentaire

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

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.