English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans C#, un type anonyme est un type sans nom (classe), dont le nom ne peut contenir que des attributs publics en lecture seule. Il ne peut pas contenir d'autres membres, tels que des champs, des méthodes, des événements, etc.
Créez un type anonyme en utilisant l'opérateur new avec la syntaxe de l'initialiseur d'objet. L'opérateur var est utilisé implicitement pour stocker la référence au type anonyme.
L'exemple suivant montre comment créer une variable de type anonyme student contenant trois attributs nommés Id, FirstName et LastName.
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
Les attributs des types anonymes sont en lecture seule, ils ne peuvent pas utiliser null, des fonctions anonymes ou des types de pointeurs pour l'initialisation. Vous pouvez utiliser le pointage (.) pour accéder à ces attributs, comme pour les attributs d'un objet. Cependant, vous ne pouvez pas modifier la valeur des attributs, car ils sont en lecture seule.
var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.Id); //Sortie1 Console.WriteLine(student.FirstName); //Sortie : James Console.WriteLine(student.LastName); //Sortie : Bond student.Id = 2;//Erreur : impossible de modifier la valeur student.FirstName = "Steve";//Erreur : impossible de modifier la valeur
Les attributs des types anonymes peuvent inclure un autre type anonyme.
var student = new { Id = 1, FirstName = "James", LastName = "Bond", Address = new { Id = 1, City = "London", Country = "UK" } };
Vous pouvez également créer un tableau de types anonymes.
var students = new[] { new { Id = 1, FirstName = "James", LastName = "Bond" }, new { Id = 2, FirstName = "Steve", LastName = "Jobs" }, new { Id = 3, FirstName = "Bill", LastName = "Gates" } };
Les types anonymes sont toujours locaux pour les méthodes qui les définissent. Ils ne peuvent pas être retournés par une méthode. Cependant, les types anonymes peuvent être passés en tant que paramètres de type d'objet à une méthode, mais il est déconseillé de le faire. Si vous devez les passer à une autre méthode, utilisez struct ou class plutôt que des types anonymes.
En règle générale, les types anonymes sont créés à l'aide de la clause select d'une requête LINQ pour retourner un sous-ensemble des propriétés de chaque objet de la collection.
class Program { static void Main(string[] args) { IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 18 }, new Student() { StudentID = 2, StudentName = "Steve", age = 21 }, new Student() { StudentID = 3, StudentName = "Bill", age = 18 }, new Student() { StudentID = 4, StudentName = "Ram" , age = 20 }, new Student() { StudentID = 5, StudentName = "Ron" , age = 21 } }; var students = from s in studentList select new { Id = s.StudentID, Name = s.StudentName }; foreach(var stud in students) Console.WriteLine(stud.Id + "-" + stud.Name); } } public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public int age { get; set; } }
1-John 2-Steve 3-Bill 4-Ram 5-Ron
Dans l'exemple ci-dessus, la clause select de la requête LINQ ne sélectionne que les propriétés StudentID et StudentName, et les renomme respectivement en Id et Name. Par conséquent, c'est très utile pour économiser de la mémoire et éviter le code inutile. Le jeu de résultats de la requête contient uniquement les propriétés StudentID et StudentName, comme le montre la vue de débogage suivante.
Visual Studio prend en charge Intellisense pour les types anonymes, comme indiqué ci-dessous.
À l'intérieur, tous les types anonymes héritent directement de la classe System.Object. Le compilateur génère une classe avec des noms automatiquement générés et applique le type approprié à chaque propriété en fonction de l'expression de valeur. Même si votre code ne peut pas y accéder. Vous pouvez utiliser la méthode GetType() pour voir le nom.
static void Main(string[] args) { var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.GetType().ToString()); }