Ko ne želimo definirati kompleksnih razredov, kot so kompleksne metode, dogodki in konstruktorji, lahko dinamično ustvarimo prilagojen podatkovni tip -> anonimni tip.
1. Določite vrsto anonimnosti
Pri definiranju anonimnega tipa morate uporabiti ključno besedo var in inicializacijsko sintakso objekta.
var: Prevajalnik samodejno ustvari novo definicijo razreda ob prevajanju (imena razreda v C# kodi ne vidimo).
Inicializacija: Prevajalniku bo naročil, naj ustvari zasebna ozadja in (samo za branje) lastnosti za novo ustvarjeni tip.
Zgradite anonimno vrsto tako, da posredujete parametre in natisnete ustrezne informacije
Klic: Anonimne tipe je mogoče zgraditi tudi s trdo kodo
2. Notranja predstavitev anonimnih tipov
Vsi anonimni tipi samodejno podedujejo od objekta, zato lahko na objektu avtomobila uporabimo ToString, GetHashCode, Equals, poskusimo to poimenovati:
Klici in rezultati:
Tip objekta avtomobila je: <>f__AnonymousType03 (tvoj je lahko drugačen), anonimno ime tipa začuti prevajalnik, ne moremo posegati, CIL koda.
3. Implementacija metod ToString() in GetHashCode().
1.ToString()
2. GetHashCode()
Uporablja spremenljivko vsake anonimne vrste za izračun zgoščene vrednosti kot vhoda tipa System.Collections.Generic.EqualityComparer in <T>proizvede isto zgoščevalno vrednost le, če imata oba anonimna tipa enake lastnosti in enako vrednost.
4. Enaka semantika anonimnih tipov
Enako()
Analizirajte rezultate:
1. Equals(): Prevajalnik preglasi Equals(), da določi, da so objekti enaki na podlagi semantike vrednosti (npr. zabeleži vrednost vsakega podatkovnega člana dveh objektov)
2. == Operatorji: Ker anonimni tipi ne preobremenjujejo ekvivalentnih operatorjev (== , !=), == primerja reference, ne vsebino.
3. GetType(): Ker če v istem asemblerju deklariramo dva enaka (z enakimi atributi) anonimna tipa, bo prevajalnik generiral definicijo le enega anonimnega tipa.
5. Anonimni tipi, ki vsebujejo anonimne tipe
Povzetek:
Pravzaprav moramo biti previdni pri uporabi anonimnih tipov, še posebej pri uporabi LINQ, in nikoli ne opustiti uporabe močno tipiziranih razredov ali struktur zaradi pojava anonimnih tipov.
Pravzaprav ima anonimni tip sam po sebi veliko omejitev:
- Ne nadzoruješ imena anonimnega tipa
- Anonimni tipi podedujejo System.Object
- Anonimne vrste polj in atributov so vedno samo za branje
- Anonimni tipi ne podpirajo dogodkov, prilagojenih metod, lastnih operatorjev in prilagojenih prepisov
- Anonimni tipi so implicitno zapečateni
- Ustvarjanje entitet anonimnih tipov uporablja le privzeti konstruktor
Če moramo hitro definirati obliko entitete brez definiranja njene funkcije, lahko uporabimo anonimni tip. |