Jeg har drevet med .NET-utvikling lenge, og har nylig anmeldt boken "C# Advanced Programming". Jeg fant ut at mange problemer jeg tidligere så ut til å forstå, men ikke forsto, faktisk kan studeres og forstås sakte.
Så jeg planlegger å begynne å skrive et blogginnlegg om "C# Advanced Programming Series". Den vil bygge på konseptet fra boken "C# Advanced Programming", og vil også referere til blogginnlegg fra andre eksperter, jeg håper du forstår. Hvis det er noe galt, vennligst korriger det.
(Også: Dette blogginnlegget vil ikke forklare det grunnleggende om definisjoner og grammatikk.) )
La oss snakke om kommisjonering.
Delegate brukes mye i .NET. Lambda-uttrykk, hendelser, anonymitetsmetoder osv. vil være involvert (følg med for påfølgende blogginnlegg).
Så hva er tillit?
Enkelt sagt er delegater ikke annerledes enn å spesifisere metoder, bortsett fra at de må spesifisere delegatnøkkelordet og ikke har noen metodeentitet. Du kan tenke på det som en plassholder, for eksempel når du skriver kode uten å vite hva du skal håndtere. Du trenger bare å vite hvilken parametertype og utgangstype du skal introdusere og definere det. Dette er metoden som formidles i boken om at signaturen må bety det samme.
La oss definere en grunnleggende delegasjon:
Utførelsesresultater:
Ser du det ovennevnte praktiske stedet å betro? NemligEn delegat kan kjøre hvilken som helst metode med samme inntastingsparametertype og returtype, eller til og med en metodekø med samme signatur.
Så må virkelig våre metodesignaturer (dvs. import- og utdataparametere) være nøyaktig de samme som delegaten? Svar: Nei, vi kan ikke ignorere kovarians og invers variasjon. La oss kort introdusere kunnskapen om kovariant og inverter.
"Kovarians" betyr å kunne bruke en type som er mer avledet enn den opprinnelig spesifiserte avledede typen. "Inverter" refererer til evnen til å bruke en type med mindre grad av avledning. Deretter er vår kommisjon også underlagt kovarians og invers.
Dette betyr at hvis en delegat er definert, kan ikke bare nøyaktig samme signaturmetode tildele verdi til delegatvariabelen.
Hvis en metodes parametertabell matcher delegatdeklarasjonen, men returnerer en avledet klasse av (delegatdeklarasjonen returnerer typen), kan metoden også tilordnes denne delegatvariabelen.
Hvis returtypen til en metode samsvarer med delegatens deklarasjon, men argumentet er forfaderklassen til delegatdeklarasjonsparametertypen, kan metoden også tilordnes delegatvariabelen.
Hvis parameterne og returtypen til en metode samsvarer med forutsetningene i de to linjene ovenfor, kan metoden også tildeles delegatvariabelen.
Følgende er et enkelt eksempel på kovariant vs. inverter:
Kovarians:
Inverter:
|