Wanneer we complexe klassen zoals complexe methoden, events en constructors niet willen definiëren, kunnen we dynamisch een aangepast datatype -> anoniem type genereren.
1. Definieer het type anonimiteit
Bij het definiëren van een anoniem type moet je het var-sleutelwoord en de syntaxis van objectinitialisatie gebruiken.
var: De compiler genereert automatisch een nieuwe klassedefinitie bij het compileren (we kunnen de naam van de klasse niet zien in de C#-code).
Initialisatie: Het zal de compiler vertellen om privé-achtergrondvelden en (alleen-lezen) eigenschappen te maken voor het nieuw aangemaakte type.
Bouw een anonieme type door parameters door te geven en print de relevante informatie af
Call: Anonieme types kunnen ook worden gebouwd met hardcode
2. Interne representatie van anonieme types
Alle anonieme types erven automatisch van Object, dus we kunnen ToString, GetHashCode, Equals gebruiken op het autoobject, laten we proberen dit aan te roepen:
Oproepen en resultaten:
Het type autoobject is: <>f__AnonymousType03 (die van jou kan anders zijn), de anonieme typenaam wordt gevoeld door de compiler, we kunnen niet ingrijpen, CIL-code.
3. Implementatie van methoden ToString() en GetHashCode().
1.ToString()
2.GetHashCode()
Het gebruikt de variabele van elk anoniem type om de hashwaarde te berekenen als de type-invoer van System.Collections.Generic.EqualityComparer, en <T>produceert alleen dezelfde hashwaarde als de twee anonieme types dezelfde eigenschappen hebben en dezelfde waarde krijgen.
4. Gelijke semantiek van anonieme typen
Gelijk()
Analyseer de resultaten:
1. Equals(): De compiler overschrijft Equals() om te bepalen dat objecten gelijk zijn op basis van waardesemantiek (bijvoorbeeld merkt hij de waarde van elk datalid van twee objecten op)
2. == Operatoren: Omdat anonieme types equivalente operatoren niet overbelasten (== , !=), == vergelijkt referenties, niet inhoud.
3. GetType(): Omdat als we twee identieke (met dezelfde attributen) anonieme types in dezelfde assembly declareren, de compiler slechts een definitie van één anoniem type genereert.
5. Anonieme types die anonieme types bevatten
Samenvatting:
Sterker nog, we moeten voorzichtig zijn met het gebruik van anonieme types, vooral bij LINQ, en nooit stoppen met het gebruik van sterk getypeerde klassen of structuren vanwege het ontstaan van anonieme types.
In feite heeft het anonieme type zelf veel beperkingen:
- Je hebt geen controle over de naam van het anonieme type
- Anonieme types erven System.Object
- Anonieme typen velden en attributen zijn altijd alleen-lezen
- Anonieme types ondersteunen geen events, custom methods, custom operators en aangepaste herschrijvingen niet
- Anonieme types zijn impliciet verzegeld
- Het aanmaken van anonieme types gebruikt alleen de standaardconstructor
Als we snel de vorm van een entiteit moeten definiëren zonder de functie te definiëren, kunnen we het anonieme type gebruiken. |