Когда мы не хотим определять сложные классы, такие как сложные методы, события и конструкторы, мы можем динамически генерировать пользовательский тип данных -> анонимный.
1. Определите тип анонимности
При определении анонимного типа необходимо использовать синтаксис ключевого слова var и инициализации объекта.
var: Компилятор автоматически генерирует новое определение класса во время компиляции (мы не видим название класса в коде на C#).
Инициализация: Компилятору нужно создать приватные фоновые поля и свойства только для чтения для нового типа.
Постройте анонимный тип, передавая параметры, и печатайте соответствующую информацию
Вызов: Анонимные типы также можно создавать с использованием жёсткого кода
2. Внутреннее представление анонимных типов
Все анонимные типы автоматически наследуют от объекта, поэтому мы можем использовать 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
- Анонимные типы полей и атрибутов всегда доступны только для чтения
- Анонимные типы не поддерживают события, пользовательские методы, пользовательские операторы и кастомные переписывания
- Анонимные типы неявно запечатаны
- Создание сущностей анонимных типов использует только стандартный конструктор
Если нужно быстро определить форму сущности без определения её функции, можно использовать анонимный тип. |