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