Kui me ei taha defineerida keerukaid klasse nagu kompleksmeetodid, sündmused ja konstruktorid, saame dünaamiliselt genereerida kohandatud andmetüübi -> anonüümse tüübi.
1. Määratle anonüümsuse tüüp
Anonüümse tüübi määratlemisel tuleb kasutada var märksõna ja objekti initsialiseerimissüntaksit.
var: kompilaator genereerib kompileerimise ajal automaatselt uue klassi definitsiooni (me ei näe klassi nime C# koodis).
Initsialiseerimine: See ütleb kompilaatorile, et ta looks uue tüübi jaoks privaatseid taustavälju ja (ainult lugemiseks) omadusi.
Koosta anonüümne tüüp, edastades parameetreid ja prindi asjakohane info
Call: Anonüümseid tüüpe saab ehitada ka kõvakoodiga
2. Anonüümsete tüüpide sisemine esindatus
Kõik anonüümsed tüübid pärivad automaatselt objektilt, seega saame kasutada ToStringi, GetHashCode'i, Equalsi auto objektil, proovime seda nimetada:
Kõned ja tulemused:
Auto objekti tüüp on: <>f__AnonymousType03 (sinu oma võib olla erinev), anonüümne tüübinimi on kompilaator poolt tunnetatud, me ei saa sekkuda, CIL kood.
3. Meetodite ToString() ja GetHashCode() rakendamine.
1.ToString()
2.GetHashCode()
See kasutab iga anonüümse tüübi muutujat, et arvutada räsi väärtus System.Collections.Generic.EqualityCompareri tüübi sisendina ning <T>annab sama räsi väärtuse ainult siis, kui kahel anonüümsel tüübil on samad omadused ja neile antakse sama väärtus.
4. Anonüümsete tüüpide võrdne semantika
Võrdub()
Analüüsi tulemusi:
1. Equals(): Kompilaator tühistab Equals() väärtuse, et määrata objektid võrdsed väärtuse semantika põhjal (nt märgib iga andmeliikme väärtust kahe objekti puhul)
2. == Operaatorid: Kuna anonüümsed tüübid ei koorma ekvivalentseid operaatoreid (== , !=), == võrdleb viiteid, mitte sisu.
3. GetType(): Sest kui deklareerime samas assamblees kaks identset (samade atribuutidega) anonüümset tüüpi, genereerib kompilaator ainult ühe anonüümse tüübi definitsiooni.
5. Anonüümsed tüübid, mis sisaldavad anonüümseid tüüpe
Kokkuvõte:
Tegelikult peaksime olema ettevaatlikud anonüümsete tüüpide kasutamisel, eriti LINQ kasutamisel, ning mitte kunagi loobuma tugevalt tüübistatud klasside või struktuuride kasutamisest anonüümsete tüüpide tekkimise tõttu.
Tegelikult on anonüümsel tüübil endal palju piiranguid:
- Sa ei kontrolli anonüümse tüübi nime
- Anonüümsed tüübid pärivad System.Object
- Anonüümsed väljade ja atribuutide tüübid on alati ainult lugemiseks
- Anonüümsed tüübid ei toeta sündmusi, kohandatud meetodeid, kohandatud operaatoreid ega kohandatud ümberkirjutusi
- Anonüümsed tüübid on implitsiitselt suletud
- Anonüümsete tüüpide entiteetide loomine kasutab ainult vaikimisi konstruktorit
Kui peame kiiresti määratlema üksuse kuju ilma selle funktsiooni määratlemata, saame kasutada anonüümset tüüpi. |