**Анонимный тип** — это тип, созданный во время компиляции для хранения набора значений, который имеет свойства, но не требует явного определения класса. Анонимные типы — удобный инструмент для временного хранения данных и выполнения операций, не требующих явного объявления класса. Они особенно полезны в LINQ и позволяют писать компактный и читаемый код. Однако для долгосрочного хранения данных лучше использовать явные классы или структуры. Поддержка анонимных типов (anonymous types) появилась в C# **с версии 3.0**. Это было частью крупного обновления языка, которое включало LINQ (Language Integrated Query), лямбда-выражения и автоматические свойства. ### Преимущества: 1. **Упрощение кода**: - Нет необходимости создавать временные классы для разовых операций. 2. **Повышение читаемости**: - Компактная запись без потери функциональности. 3. **Интеграция с LINQ**: - Позволяет легко работать с данными и фильтровать их. --- ### Ограничения: 1. **Только локальное использование:** - Тип определяется только в пределах текущего метода или контекста. - Анонимный тип нельзя вернуть из метода напрямую (если только не использовать `object` или `dynamic`). - Объект анонимного типа **нельзя напрямую сохранить в поле** класса или структуры, так как его тип не имеет имени и предназначен только для локального использования. (если только не использовать `object` или `dynamic`). 2. **Неизменяемость:** - Значения свойств задаются только при создании объекта, и их нельзя изменить позже. 3. **Невозможно переиспользовать:** - Если нужно использовать структуру в нескольких местах, лучше создать обычный класс. --- #### Основные особенности: 1. **Инициализация с использованием `new { }`:** - Создаётся объект с указанными свойствами. - Тип этих свойств определяется компилятором на основе присвоенных значений. 2. **Только для чтения (immutable):** - Свойства анонимного типа являются только для чтения (read-only). - Значения свойств задаются при создании объекта и не могут быть изменены. 3. **Вывод типа через `var`:** - Для работы с анонимными типами используется `var`, так как имя типа неизвестно. 4. **Используется для локальных операций:** - Чаще всего применяются в LINQ-запросах или для временного хранения данных. --- ### Пример использования: ```csharp var person = new { Name = "John Doe", // Тип свойства Name -> string Age = 30, // Тип свойства Age -> int IsEmployed = true // Тип свойства IsEmployed -> bool }; // Доступ к свойствам Console.WriteLine(quot;Name: {person.Name}, Age: {person.Age}, Employed: {person.IsEmployed}"); ``` ### Как создаётся анонимный тип: Компилятор автоматически генерирует класс со следующими свойствами: - Свойства становятся `public`. - Свойства можно только читать (они имеют только `get`). - Анонимные типы поддерживают переопределённые методы `Equals`, `GetHashCode` и `ToString`. --- ### Применение в LINQ: Анонимные типы часто используются в LINQ для формирования проекций (процесс создания нового набора данных): ```csharp var people = new[] { new { Name = "Alice", Age = 25 }, new { Name = "Bob", Age = 30 } }; var adults = from person in people where person.Age >= 18 select new { person.Name, IsAdult = true }; foreach (var adult in adults) { Console.WriteLine(quot;Name: {adult.Name}, IsAdult: {adult.IsAdult}"); } ``` ---