Olen kaua tegelenud .NET arendusega ja hiljuti arvustasin raamatut "C# Advanced Programming". Leidsin, et paljud probleemid, mida ma varem tundsin mõistvat, kuid ei mõistnud, saab tegelikult aeglaselt uurida ja mõista.
Seega plaanin hakata kirjutama blogipostitust teemal "C# Advanced Programming Series". See tugineb raamatu "C# Advanced Programming" kontseptsioonile ning viitab ka teiste ekspertide blogipostitustele, loodan, et mõistate. Kui midagi on valesti, palun parandage see.
(Samuti: See blogipostitus ei selgita definitsioonide ja grammatika põhialuseid.) )
Räägime komisjonistamisest.
Delegate on laialdaselt kasutusel .NET-is. Lambda väljendid, sündmused, anonüümsuse meetodid jms on kaasatud (jälgige järgmisi blogipostitusi).
Mis siis on usaldamine?
Lihtsas keeles ei erine delegaadid meetodite määramisest, välja arvatud see, et nad peavad määrama delegeeritud märksõna ja neil puudub meetodi üksus. Võid mõelda sellele kui ajutise lahendusena, näiteks kui kirjutad koodi teadmata, millega tegeled. Sa pead lihtsalt teadma, millised on parameetri tüüp ja väljundtüüp, mida sa tutvustad, ning defineerima need. See on meetod, mida raamatus edasi antakse, et allkiri peab tähendama sama.
Määratleme põhilise delegeerimise:
Täitmise tulemused:
Kas näete ülaltoodud praktilist kohta usaldamiseks? NimeltDelegaat võib käivitada mis tahes meetodi, millel on sama vastuvõtuparameetri tüüp ja tagastustüüp, või isegi meetodijärjekorra sama allkirjaga.
Kas meie meetodi allkirjad (st impordi- ja väljundparameetrid) peavad tõesti olema täpselt samad kui delegaadil? Vastus: Ei, me ei saa ignoreerida kovariantsust ja pöörddispersiooni. Tutvustame lühidalt teadmisi kovariantide ja inverterite kohta.
"Kovariantsus" tähendab võimet kasutada tüüpi, mis on rohkem tuletatud kui algselt määratud tuletatud tüüp. "Inverter" viitab võimele kasutada tüüpi, mille tuletis on väiksem. Siis on meie komisjon samuti allutatud kovariantsusele ja pöördele.
See tähendab, et kui delegaat on defineeritud, ei saa mitte ainult täpselt sama allkirjameetod määrata delegaadi muutujale väärtust.
Kui meetodi parameetritabel vastab delegaadi deklaratsioonile, kuid tagastab tuletatud klassi (delegaadi deklaratsioon tagastab tüübi), siis võib meetodile määrata ka selle delegaadi muutuja.
Kui meetodi tagastamise tüüp vastab delegaadi deklaratsioonile, kuid argument on delegaadi deklaratsiooni parameetri tüübi eelkäijaklass, siis võib meetodi määrata ka delegaadi muutujale.
Kui meetodi parameetrid ja tagastustüüp vastavad ülaltoodud kahe rea eeldustele, saab meetodile määrata ka delegeeritud muutuja.
Järgnevalt on lihtne näide kovariantide ja inverterite vahel:
Kovariantsus:
Inverter:
|