När vi inte vill definiera komplexa klasser som komplexa metoder, händelser och konstruktorer kan vi dynamiskt generera en anpassad datatyp -> anonym typ.
1. Definiera typen av anonymitet
När du definierar en anonym typ behöver du använda nyckelordet var och objektinitieringssyntaxen.
var: Kompilatorn genererar automatiskt en ny klassdefinition vid kompileringstillfället (vi kan inte se namnet på klassen i C#-koden).
Initiering: Den kommer att be kompilatorn skapa privata bakgrundsfält och (skrivskyddade) egenskaper för den nyskapade typen.
Konstruera en anonym typ genom att skicka parametrar och skriv ut relevant information
Anrop: Anonyma typer kan också byggas med hårdkod
2. Intern representation av anonyma typer
Alla anonyma typer ärver automatiskt från objektet, så vi kan använda ToString, GetHashCode, Equals på bilobjektet, låt oss försöka anropa detta:
Samtal och resultat:
Typen på bilobjektet är: <>f__AnonymousType03 (ditt kan vara annorlunda), det anonyma typnamnet känns av kompilatorn, vi kan inte störa, CIL-kod.
3. Implementering av metoderna ToString() och GetHashCode().
1.ToString()
2.GetHashCode()
Den använder variabeln för varje anonym typ för att beräkna hashvärdet som typindata för System.Collections.Generic.EqualityComparer, och <T>producerar bara samma hashvärde om de två anonyma typerna har samma egenskaper och ges samma värde.
4. Lika semantik för anonyma typer
Equals()
Analysera resultaten:
1. Equals(): Kompilatorn åsidosätter Equals() för att avgöra att objekten är lika baserat på värdesemantik (t.ex. noterar värdet på varje datamedlem i två objekt)
2. == Operatorer: Eftersom anonyma typer inte överbelastar ekvivalenta operatorer (== , !=), == jämför referenser, inte innehåll.
3. GetType(): För om vi deklarerar två identiska (med samma attribut) anonyma typer i samma assembler, kommer kompilatorn endast att generera en definition av en anonym typ.
5. Anonyma typer som innehåller anonyma typer
Sammanfattning:
Faktum är att vi bör vara försiktiga med att använda anonyma typer, särskilt när vi använder LINQ, och aldrig ge upp att använda starkt typade klasser eller strukturer på grund av framväxten av anonyma typer.
Faktum är att den anonyma typen i sig har många begränsningar:
- Du kontrollerar inte namnet på den anonyma typen
- Anonyma typer ärver System.Objekt
- Anonyma typer av fält och attribut är alltid skrivskyddade
- Anonyma typer stöder inte händelser, anpassade metoder, anpassade operatorer och anpassade omskrivningar
- Anonyma typer är implicit förseglade
- Entitetskapande av anonyma typer använder endast standardkonstruktören
Om vi snabbt behöver definiera formen på en entitet utan att definiera dess funktion kan vi använda den anonyma typen. |