C# 2.0, un an après Mitsuru FURUTA Relations techniques développeurs - Microsoft France mitsufu@microsoft.com – http://blogs.microsoft.fr/mitsufu
Agenda Introduction Generics Nullables -- Pause -- Méthodes anonymes Itérations …C# 3.0
Introduction Pourquoi une telle présentation ? Au delà de la compréhension technique, un nouveau langage demande également à être assimilé et intégré dans nos habitudes de développement. C# 2.0 apporte plusieurs nouvelles extensions importantes permettant d’exploiter toujours au mieux les nouveautés de la plate-forme .Net 2.0. Avant d’adopter ces nouveautés, il est nécessaire d’en comprendre à la fois les intérêts et les contraintes.
Les generics Les generics permettent aux classes, structures, interfaces, délégués et méthodes d’être paramètrés par les types de données qu’ils stockent et qu’ils manipulent. Les types ainsi définis apportent: la robustesse d’un typage fort la clarté du code (plus de casts) la performance en supprimant les boxing/unboxing la sécurité d’une vérification accrue à la compilation Bien que ressemblant fortement aux templates du C++, la syntaxe de C# 2.0 offre une approche plus simple et plus sécurisée. (limitations, contraintes)
Les generics: syntaxe class MyClass<T> {} struct MyStruct<T> {} delegate R MyDelegate<P, R>(P param); interface IMyInterface<T> { T GetData(); } void MyMethod<T>(List<T> param) {}; Contraintes: where, new(), struct Le mot clé “default” Attention aux overloads Ne pas casser la programmation objet !
Generics: syntaxe et introduction + Reflector Demo Generics: syntaxe et introduction + Reflector
Les generics: inférence de type Possibilité d’omettre un paramètre de type lorsque le compilateur peut le déduire de manière certaine Cette fonctionnalité est primordiale pour la simplicité d’écriture des séquences Linq q.Select<string>().ToList<string>().First<string>(); q.Select().ToList().First();
Generics: l’inférence de type Demo Generics: l’inférence de type
Les generics: compilation et reflection Nature de la compilation Les generics ne sont pas des templates ! Les vérifications de types ont bien lieu à la compilation comme avec un pré-processeur de templates Mais les classes typées ne sont pas compilées en IL (!= java) Les generics sont identifiés dans les assembly .Net Les classes (ou méthodes) fortement typées sont compilées nativement au moment de la première utilisation de chacune La reflection de la CLR 2.0 a été étendue pour récupérer ces informations de type Tests: t.IsGenericType, t.IsGenericTypeDefinition Création: Type.MakeGenericType()
Generics: la reflection Demo Generics: la reflection
Les generics: compilation et reflection Quelques dangers: Membres statiques Classes imbriquées
Les generics: cas d’utilisation FileLineReader Gestion d’un cache d’objects
Generics: cas d’utilisation FileLineReader Gestion d’un cache d’objets Demo Generics: cas d’utilisation FileLineReader Gestion d’un cache d’objets
Les nullables Syntaxe et définition: Le cas de DBNull.Value Les nullables sont des structures génériques qui permettent de remplacer les types « valeurs » en leur apportant la possibilité d’être null. Nullable<Int> i; i = 123; int j = (int) i; int j = i.Value; if (i.HasValue) Le cas de DBNull.Value
Nullables: définition + Reflector Demo Nullables: définition + Reflector
Pause
Les méthodes anonymes Syntaxe et définition Les méthodes anonymes permettent de fournir à un délégué des instructions directement « inlinées » à l’endroit où le délégué est affecté. Tous les évènements et callbacks du framework .Net étant basés sur des délégués, les méthodes anonymes simplifient grandement leur usage. Outre une simplification d’écriture, les méthodes anonymes permettent d’avoir un accès partagé avec la portée locale. L’exécution réelle du délégué pouvant être asynchrone, une structure complexe permet la « survie » des données partagées au-delà de la méthode « hôte ».
Demo Les méthodes anonymes: Introduction + Reflector Méthodes de List<>
Les méthodes anonymes: Exécution différée et exécution parallèle Demo Les méthodes anonymes: Exécution différée et exécution parallèle
Les méthodes anonymes Comportement avec les instructions de bloc Attention à la lisibilité ! Le cas du try…catch Profiter de l’exécution différée Factoriser les instructions de bloc !
Les méthodes anonymes: Les instructions de bloc Demo Les méthodes anonymes: Les instructions de bloc
Itérations Rappel sur IEnumerator Reset/Current/MoveNext IEnumerable ou comment combler l’absence de délégation d’implémentation d’interface Les mots clés: yield return / yield break
Demo Les itérations: FileLineReader, suite et fin Les classes Enum revisitées
…C# 3.0 Les expressions lambda Les requêtes Linq Offrir une écriture simplifiée des méthodes anonymes button1.Click += (o, args) => MessageBox.Show(o); Les requêtes Linq
C# 3.0 ToDictionnary() Recherche d’attributs Demo C# 3.0 ToDictionnary() Recherche d’attributs