Практические приложения анонимных типов
Представьте, что вы готовите краткую сводку элементов в складе. Вместо создания подробных записей для каждого элемента вы запишите только необходимые ключевые сведения, такие как имя и цена, во временном списке. Этот подход помогает оставаться упорядоченным без ненужных сложностей. Анонимные типы в C# работают так же, как они позволяют группировать связанные данные во временный объект без определения полного класса, что упрощает и эффективнее код.
Общие сведения о концепции анонимных типов
Анонимные типы позволяют создавать объекты с свойствами, доступными только для чтения, без определения класса. Компилятор создает имя для типа, который недоступен на уровне исходного кода. Компилятор определяет тип каждого свойства.
- Анонимные типы создаются с помощью
new
операторов и инициализаторов объектов. - Они часто используются в запросах Language-Integrated запросов (LINQ) для возврата подмножества свойств из объектов.
Рассмотрим пример.
var v = new { Amount = 108, Message = "Hello" };
Console.WriteLine($"{v.Amount} - {v.Message}");
Примечание.
Анонимные типы не могут включать методы, события или значения NULL в качестве инициализаторов свойств.
Создание анонимных типов с помощью инициализаторов объектов
Анонимные типы можно создавать с помощью new
оператора в сочетании с инициализаторами объектов. Анонимные типы упрощают создание временных объектов.
В следующем коде показано, как создать анонимный тип:
var product = new { Name = "Laptop", Price = 1200 };
Console.WriteLine($"Product: {product.Name}, Price: {product.Price}");
- Если имена элементов не указаны явным образом, компилятор использует имена инициализированных свойств.
- Анонимные типы часто объявляются с помощью неявных типизированных переменных (
var
).
Подсказка
Используйте анонимные типы для временных структур данных, где определение полного класса будет ненужным.
Использование анонимных типов в запросах LINQ
Анонимные типы часто используются в запросах LINQ для получения результатов проекта в объекты с выбранными свойствами. Анонимные типы позволяют работать только с нужными данными.
Следующий запрос LINQ демонстрирует, как проецировать анонимный тип:
var products = new[] {
new { Name = "Laptop", Price = 1200 },
new { Name = "Tablet", Price = 600 }
};
var filteredProducts = from p in products
where p.Price > 1000
select new { p.Name, p.Price };
foreach (var product in filteredProducts)
{
Console.WriteLine($"Name: {product.Name}, Price: {product.Price}");
}
- Предложение
select
создает экземпляры анонимных типов. - Запрос возвращает анонимный
IEnumerable
тип.
Примечание.
Анонимные типы являются внутренними, поэтому они не могут быть переданы через границы сборки.
Сравнение анонимных типов и типов кортежей
Анонимные типы и типы кортежей позволяют группировать связанные данные, но отличаются в удобствах использования и производительности.
Функция | Анонимные типы | Типы кортежей |
---|---|---|
Тип | Ссылочный тип (class ) |
Тип значения (struct ) |
Пользовательские имена элементов | Поддерживается | Поддерживается |
Деконструкция | Не поддерживается | Поддерживается |
Поддержка дерева выражений | Поддерживается | Не поддерживается |
- Анонимные типы доступны только для чтения и поддерживают деревья выражений.
- Кортежи являются изменяемыми и поддерживают деконструкцию.
Подсказка
Используйте анонимные типы для запросов LINQ и деревьев выражений и кортежей для сценариев, требующих мутируемости или деконструкции.
Реализация анонимных типов
Анонимные типы идеально подходят для создания временных структур данных в области метода. Они упрощают код и сокращают потребность в определении большего числа классов.
В следующем примере анонимный тип используется для временной группировки данных:
var customer = new { Name = "Mario Rogers", Age = 30 };
Console.WriteLine($"Customer: {customer.Name}, Age: {customer.Age}");
- Анонимные типы полезны для сценариев, в которых тип не требуется за пределами области метода.
- Их нельзя использовать в качестве параметров метода или возвращаемых типов.
Осторожность
Избегайте использования имени, созданного компилятором анонимного типа, так как иногда он зависит от компиляций.
Анонимные типы в C# обеспечивают эффективный способ группировки связанных данных во временные объекты без определения полного класса. Они полезны в запросах и сценариях LINQ, где достаточно упрощенной структуры только для чтения. Хотя анонимные типы являются мощными, они ограничены внутренним использованием и не могут быть переданы через границы сборки.
Научившись создавать и использовать анонимные типы, вы можете упростить код и сосредоточиться на наиболее важных данных. Используйте их для временных структур данных, быстрых проекций в запросах LINQ и сценариях, где определение полного класса будет ненужным.