**Анонимный тип** — это тип, созданный во время компиляции для хранения набора значений, который имеет свойства, но не требует явного определения класса.
Анонимные типы — удобный инструмент для временного хранения данных и выполнения операций, не требующих явного объявления класса. Они особенно полезны в 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}");
}
```
---