Коли ми не хочемо визначати складні класи, такі як складні методи, події та конструктори, ми можемо динамічно генерувати власний тип даних -> анонімним типом.
1. Визначити тип анонімності
При визначенні анонімного типу потрібно використовувати синтаксис ініціалізації ключових слів var та об'єкта.
var: Компілятор автоматично генерує нове визначення класу під час компіляції (ми не бачимо назву класу в коді C#).
Ініціалізація: Вона вкаже компілятору створити приватні фонові поля та властивості (лише для читання) для новоствореного типу.
Створіть анонімний тип, передаючи параметри, і друкуйте відповідну інформацію
Виклик: Анонімні типи також можна створювати за допомогою жорсткого коду
2. Внутрішнє представлення анонімних типів
Всі анонімні типи автоматично успадковують від Object, тому ми можемо використовувати ToString, GetHashCode, Equals на об'єкті car, спробуємо викликати це:
Дзвінки та результати:
Тип об'єкта автомобіля: <>f__AnonymousType03 (у вас може бути інакше), анонімна назва типу відчувається компілятором, ми не можемо втручатися, код CIL.
3. Реалізація методів ToString() та GetHashCode().
1.ToString()
2.GetHashCode()
Він використовує змінну кожного анонімного типу для обчислення хеш-значення як вхідного типу System.Collections.Generric.EqualityComparer і <T>дає однакове значення хешу лише якщо два анонімних типи мають однакові властивості і мають однакове значення.
4. Рівна семантика анонімних типів
Рівні()
Проаналізуйте результати:
1. Equals(): Компілятор перевизначає Equals(), щоб визначити, що об'єкти рівні на основі семантики значень (наприклад, фіксує значення кожного елемента даних двох об'єктів)
2. == Оператори: Оскільки анонімні типи не перевантажують еквівалентні оператори (== , !=), == порівнює посилання, а не зміст.
3. GetType(): Оскільки якщо ми оголосимо два ідентичних (з однаковими атрибутами) анонімні типи в одній асемблері, компілятор згенерує визначення лише одного анонімного типу.
5. Анонімні типи, які містять анонімні типи
Зведення:
Насправді, слід бути обережними з використанням анонімних типів, особливо при використанні LINQ, і ніколи не відмовлятися від використання сильно типізованих класів чи структур через появу анонімних типів.
Насправді сам анонімний тип має багато обмежень:
- Ви не контролюєте ім'я анонімного типу
- Анонімні типи успадковують System.Object
- Анонімні типи полів і атрибутів завжди доступні лише для читання
- Анонімні типи не підтримують події, кастомні методи, кастомні оператори та кастомні переписування
- Анонімні типи неявно запечатані
- Створення сутностей анонімних типів використовує лише стандартний конструктор
Якщо потрібно швидко визначити форму сутності без визначення її функції, можна використовувати анонімний тип. |