Keď nechceme definovať komplexné triedy ako komplexné metódy, udalosti a konštruktory, môžeme dynamicky generovať vlastný dátový typ -> anonymný typ.
1. Definovať typ anonymity
Pri definovaní anonymného typu musíte použiť kľúčové slovo var a inicializačnú syntax objektu.
var: Kompilátor automaticky generuje novú definíciu triedy pri kompilácii (názov triedy nevidíme v C# kóde).
Inicializácia: Kompilátoru povie, aby vytvoril súkromné pozadie a (len na čítanie) vlastnosti pre novo vytvorený typ.
Konštruujte anonymný typ odovzdaním parametrov a vytlačením relevantných informácií
Call: Anonymné typy môžu byť tiež vytvorené pomocou hardkódu
2. Interná reprezentácia anonymných typov
Všetky anonymné typy automaticky dedia z objektu, takže môžeme použiť ToString, GetHashCode, Equals na objekte auta, skúsme to nazvať:
Hovory a výsledky:
Typ objektu auta je: <>f__AnonymousType03 (tvoj môže byť iný), anonymný typ je cítený kompilátorom, nemôžeme zasahovať, CIL kód.
3. Implementácia metód ToString() a GetHashCode().
1.ToString()
2. GetHashCode()
Používa premennú každého anonymného typu na výpočet hash hodnoty ako vstupu typu System.Collections.Generic.EqualityComparer a <T>rovnakú hashovaciu hodnotu vytvára len vtedy, ak majú oba anonymné typy rovnaké vlastnosti a priradená im je rovnaká hodnota.
4. Rovnaká sémantika anonymných typov
Equals()
Analyzujte výsledky:
1. Equals(): Kompilátor prepíše Equals(), aby určil, že objekty sú rovnaké na základe sémantiky hodnôt (napr. zaznamenáva hodnotu každého dátového člena dvoch objektov)
2. == Operátory: Pretože anonymné typy nepreťažujú ekvivalentné operátory (== , !=), == porovnáva referencie, nie obsah.
3. GetType(): Pretože ak deklarujeme dva identické (s rovnakými atribútmi) anonymné typy v tej istej zostave, kompilátor vygeneruje len definíciu jedného anonymného typu.
5. Anonymné typy, ktoré obsahujú anonymné typy
Súhrn:
V skutočnosti by sme mali byť opatrní pri používaní anonymných typov, najmä pri používaní LINQ, a nikdy by sme nemali prestať používať silne typované triedy alebo štruktúry kvôli vzniku anonymných typov.
V skutočnosti má samotný anonymný typ mnoho obmedzení:
- Neovládate meno anonymného typu
- Anonymné typy zdedia System.Object
- Anonymné typy polí a atribútov sú vždy len na čítanie
- Anonymné typy nepodporujú udalosti, vlastné metódy, vlastné operátory a vlastné prepisy
- Anonymné typy sú implicitne zapečatené
- Vytváranie entít anonymných typov používa iba predvolený konštruktor
Ak potrebujeme rýchlo definovať tvar entity bez definovania jej funkcie, môžeme použiť anonymný typ. |