Wenn wir keine komplexen Klassen wie komplexe Methoden, Ereignisse und Konstruktoren definieren wollen, können wir dynamisch einen benutzerdefinierten Datentyp > anonymen Typ generieren.
1. Definieren Sie die Art der Anonymität
Beim Definieren eines anonymen Typs muss man das VAR-Schlüsselwort und die Objektinitialisierungssyntax verwenden.
var: Der Compiler generiert automatisch eine neue Klassendefinition zur Kompilierungszeit (wir können den Namen der Klasse im C#-Code nicht sehen).
Initialisierung: Er weist den Compiler an, private Hintergrundfelder und (schreibgeschützte) Eigenschaften für den neu erstellten Typ zu erstellen.
Konstruiere einen anonymen Typ, indem Parameter weitergegeben werden und die relevanten Informationen gedruckt werden
Aufruf: Anonyme Typen können ebenfalls mit Hardcode erstellt werden
2. Interne Darstellung anonymer Typen
Alle anonymen Typen erben automatisch vom Objekt, daher können wir ToString, GetHashCode, Equals auf dem Auto-Objekt verwenden, versuchen wir, das zu rufen:
Aufrufe und Ergebnisse:
Der Typ des Autoobjekts ist: <>f__AnonymousType03 (deiner kann anders sein), der anonyme Typname wird vom Compiler erkannt, wir können nicht eingreifen, CIL-Code.
3. Implementierung der Methoden ToString() und GetHashCode().
1.ToString()
2. GetHashCode()
Es verwendet die Variable jedes anonymen Typs, um den Hashwert als Typeingabe von System.Collections.Generic.EqualityComparer zu berechnen, und <T>erzeugt denselben Hashwert nur, wenn die beiden anonymen Typen die gleichen Eigenschaften haben und denselben Wert erhalten.
4. Gleiche Semantik anonymer Typen
Equals()
Analysieren Sie die Ergebnisse:
1. Equals(): Der Compiler überschreibt Equals(), um zu bestimmen, dass Objekte anhand der Wertsemantik gleich sind (z. B. notiert er den Wert jedes Datenelements von zwei Objekten)
2. == Operatoren: Da anonyme Typen keine äquivalenten Operatoren (== , !=) überladen, == vergleicht Referenzen, nicht Inhalt.
3. GetType(): Denn wenn wir zwei identische (mit denselben Attributen) anonyme Typen in derselben Assembly deklarieren, erzeugt der Compiler nur eine Definition eines anonymen Typs.
5. Anonyme Typen, die anonyme Typen enthalten
Zusammenfassung:
Tatsächlich sollten wir vorsichtig sein, anonyme Typen zu verwenden, besonders bei LINQ, und niemals aufgeben, stark typisierte Klassen oder Strukturen zu verwenden, wegen des Aufkommens anonymer Typen.
Tatsächlich hat der anonyme Typ selbst viele Einschränkungen:
- Du kontrollierst nicht den Namen des anonymen Typs
- Anonyme Typen erben System.Objekt
- Anonyme Arten von Feldern und Attributen sind stets schreibgeschützt
- Anonyme Typen unterstützen keine Events, keine benutzerdefinierten Methoden, keine benutzerdefinierten Operatoren und keine benutzerdefinierten Umschreibungen
- Anonyme Typen sind implizit versiegelt
- Die Entitätserstellung anonymer Typen verwendet nur den Standardkonstruktor
Wenn wir die Form einer Entität schnell definieren müssen, ohne ihre Funktion zu definieren, können wir den anonymen Typ verwenden. |