La 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 :
Vous remarquez que l’IntelliSense fonctionne très bien avec les types anonymes :

Voyons maintenant ce que Reflector nous affiche :
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 :
Reflector nous affiche :
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 :
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)