Практические приложения анонимных типов

Завершено

Представьте, что вы готовите краткую сводку элементов в складе. Вместо создания подробных записей для каждого элемента вы запишите только необходимые ключевые сведения, такие как имя и цена, во временном списке. Этот подход помогает оставаться упорядоченным без ненужных сложностей. Анонимные типы в 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 и сценариях, где определение полного класса будет ненужным.