Kun emme halua määritellä monimutkaisia luokkia kuten monimutkaisia metodeja, tapahtumia ja konstruktoreita, voimme dynaamisesti generoida mukautetun tietotyypin -> anonyymin tyypin.
1. Määrittele anonymiteetin tyyppi
Kun määrittelet anonyymin tyypin, sinun tulee käyttää var-avainsanaa ja objektin alustussyntaksia.
var: Kääntäjä generoi automaattisesti uuden luokkamääritelmän käännösvaiheessa (emme näe luokan nimeä C#-koodissa).
Alustus: Se käskee kääntäjää luomaan yksityisiä taustakenttiä ja (vain lukua) ominaisuuksia uudelle tyypille.
Rakenna anonyymi tyyppi välittämällä parametreja ja tulosta asiaankuuluva tieto
Kutsu: Anonyymit tyypit voidaan myös rakentaa kovakoodauksella
2. Anonyymien tyyppien sisäinen esitys
Kaikki anonyymit tyypit perivät automaattisesti Objectilta, joten voimme käyttää ToStringia, GetHashCodea, Equalsia auto-olioon, kokeillaan kutsua tätä:
Puhelut ja tulokset:
Auton objektin tyyppi on: <>f__AnonymousType03 (sinun tyyppisi voi olla erilainen), anonyymi tyyppinimi tunnetaan kääntäjässä, emme voi puuttua, CIL-koodi.
3. Metodien ToString() ja GetHashCode() toteutus.
1.ToString()
2.GetHashCode()
Se käyttää kunkin anonyymin tyypin muuttujaa laskemaan hajautusarvon System.Collections.Generic.EqualityComparerin tyypin syötteenä, ja <T>tuottaa saman hajautusarvon vain, jos kahdella anonyymillä tyypillä on samat ominaisuudet ja niille annetaan sama arvo.
4. Anonyymien tyyppien yhtäläiset semantiikka
Equals()
Analysoi tulokset:
1. Equals(): Kääntäjä ohittaa Equals():n määrittääkseen, että objektit ovat yhtä suuria arvosemantiikan perusteella (esim. huomioi kahden objektin jokaisen datajäsenen arvon)
2. == Operaattorit: Koska anonyymit tyypit eivät ylikuormita vastaavia operaattoreita (== , !=), == vertaa viittauksia, ei sisältöä.
3. GetType(): Koska jos julistamme samassa kokoonpanossa kaksi identtistä (samoilla attribuuteilla) anonyymit tyyppiä, kääntäjä tuottaa vain yhden anonyymin tyypin määritelmän.
5. Anonyymit tyypit, jotka sisältävät anonyymejä tyyppejä
Yhteenveto:
Itse asiassa meidän tulisi olla varovaisia anonyymien tyyppien käytössä, erityisesti LINQ:n käytössä, eikä koskaan luopua vahvasti tyypitettyjen luokkien tai rakenteiden käytöstä anonyymien tyyppien yleistymisen vuoksi.
Itse asiassa anonyymillä itsessään on monia rajoituksia:
- Et hallitse anonyymin tyypin nimeä
- Anonyymit tyypit perivät System.Objectin
- Anonyymit kenttätyypit ja attribuutit ovat aina vain luku
- Anonyymit tyypit eivät tue tapahtumia, mukautettuja metodeja, mukautettuja operaattoreita tai mukautettuja uudelleenkirjoituksia
- Anonyymit tyypit ovat implisiittisesti suljettuja
- Anonyymien tyyppien entiteettien luomisessa käytetään vain oletuskonstruktoria
Jos meidän täytyy nopeasti määritellä entiteetin muoto määrittelemättä sen funktiota, voimme käyttää anonyymityyppiä. |