Când nu vrem să definim clase complexe precum metode complexe, evenimente și constructori, putem genera dinamic un tip de date personalizat -> tip anonim.
1. Definiți tipul de anonimat
Când definești un tip anonim, trebuie să folosești cuvântul cheie var și sintaxa inițializării obiectelor.
var: Compilatorul generează automat o nouă definiție a clasei în timpul compilației (nu putem vedea numele clasei în codul C#).
Inițializare: Va spune compilatorului să creeze câmpuri private de fundal și proprietăți (doar pentru citire) pentru tipul nou creat.
Construiește un tip anonim prin trecerea parametrilor și tipărește informațiile relevante
Apel: Tipurile anonime pot fi, de asemenea, construite folosind hardcode
2. Reprezentarea internă a tipurilor anonime
Toate tipurile anonime moștenesc automat de la Object, așa că putem folosi ToString, GetHashCode, Equals pe obiectul car, hai să încercăm să numim asta:
Decizii și rezultate:
Tipul obiectului mașinii este: <>f__AnonymousType03 (al tău poate fi diferit), numele anonim al tipului este simțit de compilator, nu putem interveni, cod CIL.
3. Implementarea metodelor ToString() și GetHashCode().
1.ToString()
2.GetHashCode()
Folosește variabila fiecărui tip anonim pentru a calcula valoarea hash ca intrare de tip a System.Collections.Generic.EqualityComparer și <T>produce aceeași valoare hash doar dacă cele două tipuri anonime au aceleași proprietăți și primesc aceeași valoare.
4. Semantica egală a tipurilor anonime
Egal()
Analizează rezultatele:
1. Egal(): Compilatorul suprascrie Egal() pentru a determina dacă obiectele sunt egale pe baza semanticii valorii (de exemplu, notează valoarea fiecărui membru de date a două obiecte)
2. == Operatori: Pentru că tipurile anonime nu suprasolicită operatorii echivalent (== , !=), == compară referințele, nu conținutul.
3. GetType(): Pentru că dacă declarăm două tipuri anonime identice (cu aceleași atribute) în aceeași asamblare, compilatorul va genera doar o definiție a unui singur tip anonim.
5. Tipuri anonime care conțin tipuri anonime
Rezumat:
De fapt, ar trebui să fim precauți în utilizarea tipurilor anonime, mai ales când folosim LINQ, și să nu renunțăm niciodată la utilizarea claselor sau structurilor puternic tipizate din cauza apariției tipurilor anonime.
De fapt, tipul anonim are multe limitări:
- Nu controlezi numele tipului anonim
- Tipurile anonime moștenesc System.Object
- Tipurile anonime de câmpuri și atribute sunt întotdeauna doar citire
- Tipurile anonime nu suportă evenimente, metode personalizate, operatori personalizați și rescrieri personalizate
- Tipurile anonime sunt sigilate implicit
- Crearea entității de tipuri anonime folosește doar constructorul implicit
Dacă trebuie să definim rapid forma unei entități fără a-i defini funcția, putem folosi tipul anonim. |