Types anonymes (Guide de programmation C#)

Mise à jour : Juillet 2008

Les types anonymes représentent un moyen pratique d'encapsuler un jeu de propriétés en lecture seule dans un objet unique sans avoir à définir préalablement un type de manière explicite. Le nom de type est généré par le compilateur et n'est pas disponible au niveau du code source. Le type des propriétés est déduit par le compilateur. L'exemple suivant présente un type anonyme qui est initialisé avec deux propriétés appelées Montant et Message.

var v = new { Amount = 108, Message = "Hello" };

En général, les types anonymes sont utilisés dans la clause select d'une expression de requête pour retourner un sous-ensemble des propriétés de chaque objet dans la séquence source. Pour plus d'informations sur les requêtes, consultez Expressions de requête LINQ (Guide de programmation C#).

Les types anonymes sont créés en utilisant l'opérateur new avec un initialiseur d'objet. Pour plus d'informations sur les initialiseurs d'objets, consultez Initialiseurs d'objets et de collection (Guide de programmation C#).

Les types anonymes sont des types class qui se composent d'une ou plusieurs propriétés publiques en lecture seule. Aucun autre type de membre de classe tel que des méthodes ou des événements n'est autorisé. Un type anonyme ne peut pas être casté en une interface ou type à l'exception de object.

Le scénario le plus courant consiste à initialiser un type anonyme avec certaines propriétés d'un autre type. Dans l'exemple suivant, supposons une classe nommée Product qui inclut les propriétés Color et Price avec plusieurs autres propriétés qui ne vous intéressent pas. Products est une collection d'objets Product. La déclaration de type anonyme démarre avec le mot clé new. Elle initialise un nouveau type qui utilise uniquement deux propriétés de Product. De ce fait, une plus petite quantité de données est retournée dans la requête.

Si vous ne spécifiez pas de noms de membre dans le type anonyme, le compilateur donne aux membres de type anonyme le même nom que la propriété qui est utilisée pour les initialiser. Vous devez fournir un nom à une propriété initialisée avec une expression.

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

Lorsqu'un type anonyme est assigné à une variable, cette variable doit être initialisée avec la construction var. Cela est dû au fait que seul le compilateur a accès au nom sous-jacent du type anonyme. Pour plus d'informations sur var, consultez Variables locales implicitement typées (Guide de programmation C#).

Notes

Les types anonymes sont des types référence qui dérivent directement d'object. Le compilateur leur donne un nom, même si votre application ne peut pas y accéder. Du point de vue du Common Language Runtime, un type anonyme est semblable à tout autre type référence, mais il ne peut pas être casté en un autre type à l'exception de object.

Si deux types anonymes ou plus ont le même nombre et le même type de propriétés dans le même ordre, le compilateur les traite comme le même type et ils partagent les mêmes informations de type générées par le compilateur.

Un type anonyme a la portée de la méthode. Pour passer un type anonyme ou une collection qui contient des types anonymes à l'extérieur des limites d'une méthode, vous devez d'abord effectuer un cast du type en objet. Toutefois, cette action annule le typage fort du type anonyme. Si vous devez stocker les résultats de vos requêtes ou les passer à l'extérieur des limites de la méthode, envisagez d'utiliser un struct nommé ordinaire ou une classe au lieu d'un type anonyme.

Les types anonymes ne peuvent pas contenir de types non sécurisés comme propriétés.

Étant donné que les méthodes Equals et GetHashCode sur les types anonymes sont définies en termes de Equals et GetHashcode des propriétés, deux instances du même type anonyme sont égales uniquement si toutes leurs propriétés sont égales.

Voir aussi

Concepts

Guide de programmation C#

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

Référence

Initialiseurs d'objets et de collection (Guide de programmation C#)

Autres ressources

Mise en route de LINQ en C#

Historique des modifications

Date

Historique

Raison

Juillet 2008

Ajout d'informations relatives aux restrictions de cast au texte d'introduction et à la section Remarques.

Améliorations apportées aux informations.