Types anonymes (Guide de programmation C#)
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 de chaque propriété est déduit par le compilateur.
Les types anonymes sont créés à l'aide de 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#).
L'exemple suivant montre un type anonyme qui est initialisée avec deux propriétés nommées Amount et Message.
var v = new { Amount = 108, Message = "Hello" };
// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);
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 contiennent 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 valide. L'expression utilisée pour initialiser une propriété ne peut pas être null, une fonction anonyme ou un type de pointeur.
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 qu'il existe une classe nommée Product. La classe Product se compose des propriétés Color et Price, ainsi que d'autres propriétés qui ne vous intéressent pas. La variable products est une collection d'objets Product. La déclaration de type anonyme démarre avec le mot clé new. La déclaration 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 pour une propriété qui est initialisée avec une expression, comme l'illustre l'exemple précédent. Dans l'exemple suivant, les noms des propriétés du type anonyme sont Color et Price.
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);
}
En général, lorsque vous utilisez un type anonyme pour initialiser une variable, vous déclarez la variable comme variable locale implicitement typée à l'aide de var. Le nom de type ne peut pas être spécifié dans la déclaration de variable, car 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#).
Vous pouvez créer un tableau d'éléments typés de manière anonyme en combinant une variable locale implicitement typée et un tableau implicitement typé, comme indiqué dans l'exemple suivant.
var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};
Notes
Les types anonymes sont des types class qui dérivent directement d'object. Le compilateur fournit un nom à chaque type anonyme, bien que votre application ne puisse 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 dans le même assembly 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. Ils partagent les mêmes informations de type générées par le compilateur.
Vous ne pouvez pas déclarer un champ, une propriété, un événement ou le type de retour d'une méthode comme ayant un type anonyme. De même, vous ne pouvez pas déclarer un paramètre formel d'une méthode, d'une propriété, d'un constructeur ou d'un indexeur comme étant de type anonyme. Pour passer un type anonyme, ou une collection qui contient des types anonymes, en tant qu'argument à une méthode, vous pouvez déclarer le paramètre comme objet de type. Toutefois, cela annule l'objectif du typage fort. 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.
Étant donné que les méthodes Equals et GetHashCode sur les types anonymes sont définies en termes de méthode 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
Référence
Initialiseurs d'objets et de collection (Guide de programmation C#)
Concepts
Expressions de requête LINQ (Guide de programmation C#)
Autres ressources
Historique des modifications
Date |
Historique |
Motif |
---|---|---|
Avril 2011 |
A clarifié le texte. |
Commentaires client. |