Når vi ikke ønsker at definere komplekse klasser som komplekse metoder, begivenheder og konstruktører, kan vi dynamisk generere en brugerdefineret datatype -> anonym type.
1. Definér typen af anonymitet
Når du definerer en anonym type, skal du bruge var-nøgleordet og objektinitialiseringssyntaksen.
var: Kompilatoren genererer automatisk en ny klassedefinition ved kompilering (vi kan ikke se navnet på klassen i C#-koden).
Initialisering: Den vil fortælle compileren at oprette private baggrundsfelter og (skrivebeskyttede) egenskaber for den nyoprettede type.
Konstruer en anonym type ved at sende parametre og udskriv de relevante oplysninger
Kald: Anonyme typer kan også bygges ved hjælp af hardcode
2. Intern repræsentation af anonyme typer
Alle anonyme typer arver automatisk fra objektet, så vi kan bruge ToString, GetHashCode, Equals på bilobjektet, lad os prøve at kalde dette:
Opkald og resultater:
Typen af bilobjektet er: <>f__AnonymousType03 (din kan være anderledes), det anonyme typenavn mærkes af compileren, vi kan ikke blande os, CIL-kode.
3. Implementering af metoderne ToString() og GetHashCode().
1.ToString()
2.GetHashCode()
Den bruger variablen for hver anonym type til at beregne hashværdien som typeinput for System.Collections.Generic.EqualityComparer, og <T>producerer kun den samme hashværdi, hvis de to anonyme typer har de samme egenskaber og får samme værdi.
4. Lige semantik for anonyme typer
Lige()
Analyser resultaterne:
1. Equals(): Compileren overskriver Equals() for at afgøre, at objekter er lige baseret på værdisemantik (f.eks. noterer værdien af hvert datamedlem i to objekter)
2. == Operatorer: Fordi anonyme typer ikke overbelaster ækvivalente operatorer (== , !=), == sammenligner referencer, ikke indhold.
3. GetType(): Fordi hvis vi erklærer to identiske (med de samme attributter) anonyme typer i samme assembly, vil compileren kun generere en definition af én anonym type.
5. Anonyme typer, der indeholder anonyme typer
Resumé:
Faktisk bør vi være forsigtige med at bruge anonyme typer, især når vi bruger LINQ, og aldrig opgive at bruge stærkt typede klasser eller strukturer på grund af fremkomsten af anonyme typer.
Faktisk har den anonyme type mange begrænsninger:
- Du kontrollerer ikke navnet på den anonyme type
- Anonyme typer arver System.Objekt
- Anonyme typer af felter og attributter er altid skrivebeskyttede
- Anonyme typer understøtter ikke events, brugerdefinerede metoder, brugerdefinerede operatører og brugerdefinerede omskrivninger
- Anonyme typer er implicit forseglede
- Entitetsoprettelse af anonyme typer bruger kun standardkonstruktøren
Hvis vi hurtigt skal definere formen af en enhed uden at definere dens funktion, kan vi bruge den anonyme type. |