Tutoriel : Utilisation des types anonymes (C# 3.5)

by Fabien Lavocat 11. May 2008 03:47

clip_image001La migration du blog étant terminé, il ne reste plus qu'à continuer à vous faire partager mes connaissances en développement .NET.

Ce tutoriel vous présentera plusieurs utilisations des types anonymes en C#.
Commençons par le commencement, qu’est ce qu’un type anonyme ?

Un type anonyme, comme son nom l’indique, est un type dont on ne définira pas le nom de manière explicite. (Oui j’ai cherché très longtemps cette définition) Mais est ce que l’on peut s’en servir si l’on ne lui donne pas de nom ? Et bien le compilateur lui donnera un nom, qui ne nous importe peu. Nous allons nous servir de notre variable uniquement pour encapsuler des propriétés en lecture seule. Le but est d’éviter à avoir à créer une classe ou une structure pour utiliser des variables sans importances dans la conception du projet. Pas de problème pour les types des propriétés que nous allons donner à notre variable, le compilateur définira automatiquement les types.

Utilisation simple :

 

var voiture = new { Marque = "Aston Martin", Modele = "DB9 v12", Puissance = 450 };
Console.WriteLine(voiture.Marque + " " +
                  voiture.Modele + " " +
                  voiture.Puissance + "cv");

Ce qui nous donne :

 

image

Vous remarquez que l’IntelliSense fonctionne très bien avec les types anonymes :

clip_image005
Voyons maintenant ce que Reflector nous affiche :

clip_image007

Déchiffrons un peu tout ce code.

· Premièrement le compilateur génère automatiquement (l’attribut [CompilerGenerated] nous l’indique) dans le projet une nouvelle classe (invisible dans Visual Studio).

o Cette classe est Internal (visible uniquement dans le projet) Sealed (non dérivable)

o Elle porte un nom peu commun J mais qui contient la liste des noms de propriétés que nous avons utilisées pour la création de notre objet.

· Ensuite cette classe comporte trois champs (Marque, Modele et Puissance) en lecture seule.

· Le constructeur

· Les méthodes de la classe Object (Equals, GetHashCode et ToString)

· Et enfin les propriétés, toujours en lecture seule.

Utilisation avancée avec LINQ

Commençons par écrire une petite classe Voiture :

public class Voiture
{
    public String Marque { get; set; }
    public String Modele { get; set; }
    public Int32 Puissance { get; set; }
}

Si vous ne comprenez pas l’écriture simplifiée de cette classe, reportez-vous à : Exemple de code : Propriétés automatiques (C# 3.5).

Ensuite passons aux choses sérieuses :

// Création d'une collection de voitures
List<Voiture> voitures = new List<Voiture>()
{
    new Voiture() { Marque = "Aston Martin", Modele = "DB9", Puissance = 450 },
    new Voiture() { Marque = "Ferrari", Modele = "F430 Scuderia", Puissance = 510 },
    new Voiture() { Marque = "Aston Martin", Modele = "Vantage V8 Coupé", Puissance = 557 }, 
    new Voiture() { Marque = "Ferrari", Modele = "360 Modena", Puissance = 400 }
};
 
// Requête LINQ permettant de filtrer les voitures
var query = from v in voitures
            where v.Puissance > 400
            orderby v.Puissance
            select new { v.Marque, v.Modele };
 
// Affichage des résultats
foreach (var voiture in query)
    Console.WriteLine(voiture.Marque + " " + voiture.Modele);

Déchiffrons un peu :

· Première étape, créer une collection d’objets de type Voiture. A la place de cette étape, vous auriez pu avoir une base de données, mais pour le tutoriel, faisons au plus simple.

· Ensuite, la requête LINQ (Exemple de code : LINQ to Object) permet de filtrer la collection nommée voitures et de récupérer des objets d’un type anonyme constitué de deux propriétés :

select new { v.Marque, v.Modele };

· La dernière étape consiste à affichez la nouvelle liste de voitures que l’on a filtré.

Pourquoi avoir utilisé un type anonyme plutôt que la classe Voiture ?
Et bien cet exemple peut paraître simple, l’utilisation de la classe Voiture aurait pu être plus judicieuse car peut être plus simple à mettre en place, mais dans le cas d’objets avec beaucoup de propriétés, il peut être préférable d’utiliser un type anonyme qui nous permettra de ne récupérer que les informations dont on a besoin.

Remarquez que l’IntelliSense fonctionne très bien :

clip_image009

Reflector nous affiche :

clip_image011

Ce code correspond au même que précédemment mais avec deux propriétés au lieu de trois.

Et nous avons en sortie :

clip_image013

Liste de liens

Liens MSDN :

· Types anonymes (Guide de programmation C#)

· Mise en route de LINQ en C#

· Expressions de requête LINQ (Guide de programmation C#)

Liens internes :

· Exemple de code : LINQ to Object

· Exemple de code : Propriétés automatiques (C# 3.5)

· Exemple de code : Constructeur de classe (C# 3.5)

Tags:

Tutoriaux .NET

Comments

Add comment


(Will show your Gravatar icon)

  Country flag

biuquote
  • Comment
  • Preview
Loading



About

Fabien Lavocat

Lavocat Fabien
Ingénieur Multimédia - TMM Communication



"Blog-Microsoft.fr is an independent blog and is not affiliated with, nor has it been authorized, sponsored, or otherwise approved by Microsoft Corporation."

Contactez-moi Send mail

MVP
Microsoft Most Valuable Professional
Client Application Development