Když nechceme definovat složité třídy jako komplexní metody, události a konstruktory, můžeme dynamicky generovat vlastní datový typ -> anonymní typ.
1. Definujte typ anonymity
Při definování anonymního typu je potřeba použít klíčové slovo var a syntaxi inicializace objektu.
var: Kompilátor automaticky vygeneruje novou definici třídy při kompilaci (název třídy v kódu C# nevidíme).
Inicializace: Kompilátoru řekne, aby vytvořil soukromá pozadí a (pouze pro čtení) vlastnosti pro nově vytvořený typ.
Vytvořte anonymní typ předáním parametrů a vytiskněte relevantní informace
Call: Anonymní typy lze také vytvořit pomocí hardcode
2. Interní reprezentace anonymních typů
Všechny anonymní typy automaticky dědí z objektu, takže můžeme použít ToString, GetHashCode, Equals na objektu auta, zkusme to nazvat:
Hovory a výsledky:
Typ objektu auta je: <>f__AnonymousType03 (ten váš může být jiný), anonymní název typu je cítit kompilátorem, nemůžeme zasahovat, CIL kód.
3. Implementace metod ToString() a GetHashCode().
1.ToString()
2. GetHashCode()
Používá proměnnou každého anonymního typu k výpočtu hashovací hodnoty jako vstupu typu System.Collections.Generic.EqualityComparer a <T>stejnou hash hodnotu vytvoří pouze tehdy, pokud mají oba anonymní typy stejné vlastnosti a stejnou hodnotu.
4. Stejná sémantika anonymních typů
Rovná se()
Analyzujte výsledky:
1. Equals(): Kompilátor přepisuje Equals(), aby určil, že objekty jsou si rovné na základě sémantiky hodnot (např. zaznamenává hodnotu každého datového člena dvou objektů)
2. == Operátory: Protože anonymní typy nezatěžují ekvivalentní operátory (== , !=), == porovnává reference, nikoli obsah.
3. GetType(): Protože pokud deklarujeme dva identické (se stejnými atributy) anonymní typy ve stejném assembleru, kompilátor vygeneruje pouze definici jednoho anonymního typu.
5. Anonymní typy obsahující anonymní typy
Shrnutí:
Ve skutečnosti bychom měli být opatrní při používání anonymních typů, zejména při používání LINQ, a nikdy se nevzdávat používání silně typovaných tříd nebo struktur kvůli vzniku anonymních typů.
Ve skutečnosti má samotný anonymní typ mnoho omezení:
- Nemáte kontrolu nad jménem anonymního typu
- Anonymní typy dědí System.Object
- Anonymní typy polí a atributů jsou vždy pouze pro čtení
- Anonymní typy nepodporují události, vlastní metody, vlastní operátory a vlastní přepisy
- Anonymní typy jsou implicitně zapečetěné
- Vytváření entit anonymních typů používá pouze výchozí konstruktor
Pokud potřebujeme rychle definovat tvar entity bez definování její funkce, můžeme použít anonymní typ. |