Amikor nem akarunk bonyolult osztályokat, mint a komplex metódusokat, eseményeket és konstruktorokat, dinamikusan generálhatunk egy egyedi adattípust -> névtelen típust.
1. Definiáljuk az anonimitás típusát
Névtelen típus meghatározásához a var kulcsszót és az objektum inicializációs szintaxist kell használni.
var: A fordító automatikusan generál egy új osztálydefiníciót a fordításkor (a C# kódban nem látjuk az osztály nevét).
Inicializáció: A fordítót megmondja, hogy hozzon létre privát háttérmezőket és (csak olvasható) tulajdonságokat az újonnan létrehozott típushoz.
Építs egy anonim típust paraméterek átadásával, és a releváns információk nyomtatásával
Hívás: Anonim típusok is össze lehet építeni kemény kóddal
2. Az anonim típusok belső ábrázolása
Minden névtelen típus automatikusan öröklik az Objektumtól, így használhatjuk a ToString, GetHashCode, Equals funkciókat az autó objektumon, próbáljuk meg ezt hívni:
Hívások és eredmények:
Az autó objektum típusa: <>f__AnonymousType03 (a tiéd más lehet), az anonim típus nevét a fordító érzékeli, nem avatkozhatunk, CIL kód.
3. A ToString() és a GetHashCode() módszerek megvalósítása.
1.ToString()
2.GetHashCode()
Minden névtelen típus változóját használja a hash érték kiszámításához a System.Collections.Generic.EqualityComparer típusbemeneteként, és csak akkor <T>adja ugyanazt a hash értéket, ha a két névtelen típus ugyanazokat a tulajdonságokat kapja, és ugyanazt az értéket kapjuk.
4. Az anonim típusok egyenlő szemantikája
Equals()
Elemezd az eredményeket:
1. Equals(): A fordító felülírja az Equals() érték-szemantika alapján (pl. megjegyezi két objektum adattagjának értékét) az objektumok egyenlőségét (pl. megjegyezi két objektum adattagjának értékét)
2. == Operátorok: Mivel az anonim típusok nem terhelnek túl az ekvivalens operátorokat (== , !=), == összehasonlítja a hivatkozásokat, nem a tartalmakat.
3. GetType(): Mert ha ugyanabban az összeszerelésben két azonos (azonos attribútummal rendelkező) névtelen típust hirdetünk, a fordító csak egy névtelen típus definícióját generálja.
5. Névtelen típusok, amelyek tartalmazzák az anonim típusokat
Összefoglalás:
Valójában óvatosnak kell lennünk az anonim típusok használatával, különösen a LINQ használatában, és soha nem szabad feladni az erősen típusozott osztályokat vagy struktúrákat az anonim típusok megjelenése miatt.
Valójában az anonim típusnak is sok korlátja van:
- Nem te irányítod az anonim típus nevét
- Anonim típusok öröklik a System.Object
- Az anonim mezőtípusok és attribútumok mindig csak olvashatók
- Az anonim típusok nem támogatják az eseményeket, egyedi metódusokat, egyedi operátorokat és egyedi újraírásokat
- Az anonim típusok implicit lezártsággal vannak zárva
- Az anonim típusok entitáslétrehozása csak az alapértelmezett konstruktort használja
Ha gyorsan meg kell határoznunk egy entitás alakját anélkül, hogy meghatároznánk annak függvényét, használhatjuk az anonim típust. |