Når vi ikke ønsker å definere komplekse klasser som komplekse metoder, hendelser og konstruktører, kan vi dynamisk generere en egendefinert datatype -> anonym type.
1. Definer typen anonymitet
Når du definerer en anonym type, må du bruke var-nøkkelordet og objektinitialiseringssyntaksen.
var: Kompilatoren genererer automatisk en ny klassedefinisjon ved kompilering (vi kan ikke se navnet på klassen i C#-koden).
Initialisering: Den vil fortelle kompilatoren å opprette private bakgrunnsfelt og (skrivebeskyttet) egenskaper for den nyopprettede typen.
Konstruer en anonym type ved å sende parametere og skriv ut relevant informasjon
Kall: Anonyme typer kan også bygges ved hjelp av hardkode
2. Intern representasjon av anonyme typer
Alle anonyme typer arver automatisk fra objektet, så vi kan bruke ToString, GetHashCode, Equals på bilobjektet, la oss prøve å kalle dette:
Samtaler og resultater:
Typen på bilobjektet er: <>f__AnonymousType03 (din kan være annerledes), det anonyme typenavnet føles av kompilatoren, vi kan ikke blande oss inn, CIL-kode.
3. Implementering av metodene ToString() og GetHashCode().
1.ToString()
2.GetHashCode()
Den bruker variabelen til hver anonym type for å beregne hashverdien som typeinput for System.Collections.Generic.EqualityComparer, og <T>produserer bare samme hashverdi hvis de to anonyme typene har samme egenskaper og får samme verdi.
4. Lik semantikk for anonyme typer
Like()
Analyser resultatene:
1. Equals(): Kompilatoren overstyrer Equals() for å avgjøre at objektene er like basert på verdisemantikk (f.eks. noterer verdien til hvert datamedlem i to objekter)
2. == Operatorer: Fordi anonyme typer ikke overbelaster ekvivalente operatorer (== , !=), == sammenligner referanser, ikke innhold.
3. GetType(): Fordi hvis vi erklærer to identiske (med samme attributter) anonyme typer i samme assembly, vil kompilatoren bare generere en definisjon av én anonym type.
5. Anonyme typer som inneholder anonyme typer
Sammendrag:
Faktisk bør vi være forsiktige med å bruke anonyme typer, spesielt når vi bruker LINQ, og aldri gi opp å bruke sterkt typede klasser eller strukturer på grunn av fremveksten av anonyme typer.
Faktisk har den anonyme typen mange begrensninger:
- Du kontrollerer ikke navnet på den anonyme typen
- Anonyme typer arver System.Objekt
- Anonyme typer felt og attributter er alltid skrivebeskyttet
- Anonyme typer støtter ikke hendelser, egendefinerte metoder, egendefinerte operatører og egendefinerte omskrivinger
- Anonyme typer er implisitt forseglet
- Entitetsopprettelse av anonyme typer bruker kun standardkonstruktøren
Hvis vi raskt må definere formen til en enhet uten å definere funksjonen, kan vi bruke den anonyme typen. |