English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C# базовый курс

C# продвинутый курс

C#面向对象(OOP)

Анонимные типы в C#

 В C# анонимный тип - это тип (класс) без имени, имя которого может содержать только общие только для чтения свойства. Он не может содержать других членов, таких как поля, методы, события и т.д.

Создание анонимного типа с помощью оператора new с объектным инициализатором. Импlicitный тип переменной var используется для сохранения ссылки на анонимный тип.

Ниже приведен пример создания переменной анонимного типа student, содержащей три свойства Id, FirstName и LastName.

var student = new { Id = 1, FirstName = "James", LastName = "Bond" };

Свойства анонимного типа являются только чтением, не могут быть инициализированы null, анонимными функциями или типами указателей. Эти свойства можно доступить с помощью точечной (.) нотации, как объектные свойства. Однако, значения свойств нельзя изменить, так как они только для чтения.

var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
Console.WriteLine(student.Id); //вывод 1
Console.WriteLine(student.FirstName); //вывод: James
Console.WriteLine(student.LastName); //вывод: Bond
student.Id = 2;//ошибка: значение не может быть изменено
student.FirstName = "Steve";//ошибка: значение не может быть изменено

Свойства анонимного типа могут включать другой анонимный тип.

var student = new { 
                    Id = 1, 
                    FirstName = "James", 
                    LastName = "Bond",
                    Address = new { Id = 1, City = "London", Country = "UK" }
                };

Вы также можете создать массив анонимных типов.

var students = new[] {
            new { Id = 1, FirstName = "James", LastName = "Bond" },
            new { Id = 2, FirstName = "Steve", LastName = "Jobs" },
            new { Id = 3, FirstName = "Bill", LastName = "Gates" }
    };

Анонимные типы всегда локальны для метода, который их определяет. Их нельзя возвращать из метода. Однако, анонимные типы можно передавать в качестве параметра типа объекта методу, но это не рекомендуется. Если нужно передать их другому методу, используйте struct или class, а не анонимный тип.

Обычно, для создания анонимного типа с помощью подзапроса LINQ используется оператор Select, чтобы из каждого объекта集合 возвращать подмножество свойств.

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

В данном примере подзапрос select в LINQ выбирает свойства StudentID и StudentName и renamed их как Id и Name. Это очень полезно для экономии памяти и избежания избыточного кода. Результаты запроса содержат только свойства StudentID и StudentName, как показано в следующем окне отладки.

Visual Studio поддерживает IntelliSense для анонимных типов, как показано ниже.

Поддержка IntelliSense для анонимных типов в Visual Studio

Внутри все анонимные типы напрямую наследуются от класса System.Object. Компилятор генерирует класс с автоматически сгенерированными именами и применяет соответствующие типы к каждому свойству в зависимости от значения выражения. Хотя ваш код не может получить к нему доступ. С помощью метода GetType() можно увидеть имя.

Пример: внутреннее имя анонимного типа
static void Main(string[] args)
{    
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };    
    Console.WriteLine(student.GetType().ToString());
{}