Fac dezvoltare .NET de mult timp și recent am recenzat cartea "C# Advanced Programming". Am descoperit că multe probleme pe care păream să le înțeleg, dar pe care nu le înțelegeam, pot fi de fapt studiate și înțelese treptat.
Așadar, plănuiesc să încep să scriu o postare pe blog despre "Seria de Programare Avansată C#". Se va baza pe conceptul cărții "C# Advanced Programming" și va face referire și la postările de pe blog ale altor experți, sper că înțelegeți. Dacă este ceva în neregulă, vă rog să corectați.
(De asemenea: Această postare pe blog nu va explica elementele de bază ale definițiilor și gramaticii.) )
Să vorbim despre comisionare.
Delegate este folosit pe scară largă în .NET. Vor fi implicate expresii lambda, evenimente, metode de anonimat etc. (rămâneți pe aproape pentru postările viitoare pe blog).
Deci, ce este încredințarea?
În termeni simpli, delegații nu sunt diferiți de metodele de specificare, cu excepția faptului că trebuie să specifice cuvântul cheie delegat și nu au entitate de metodă. Poți să te gândești la asta ca la un înlocuitor, de exemplu, când scrii cod fără să știi cu ce te vei confrunta. Trebuie doar să știi ce tip de parametru și ce tip de ieșire vei introduce și să le definești. Aceasta este metoda transmisă în carte conform căreia semnătura trebuie să însemne același lucru.
Să definim o delegare de bază:
Rezultatele execuției:
Vezi locul practic de mai sus pentru a te încredința? Și anumeUn delegat poate executa orice metodă cu același tip de parametru de ingestie și același tip de return, sau chiar o coadă de metodă cu aceeași semnătură.
Deci, semnăturile noastre de metodă (adică parametrii de import și de ieșire) trebuie să fie exact aceleași ca ale delegatului? Răspuns: Nu, nu putem ignora covarianța și variația inversă. Să introducem pe scurt cunoștințele despre covariant și invertor.
"Covarianță" înseamnă capacitatea de a folosi un tip mai derivat decât tipul derivat specificat inițial. "Invertor" se referă la capacitatea de a folosi un tip cu un grad mai mic de derivație. Apoi, comisionul nostru este supus și covarianței și inversei.
Aceasta înseamnă că, dacă un delegat este definit, nu doar aceeași metodă de semnătură poate atribui valoare variabilei delegate.
Dacă tabelul parametrilor unei metode corespunde declarației delegatului, dar returnează o clasă derivată a (declarația delegatului returnează tipul), atunci metoda poate fi atribuită și acestei variabile delegate.
Dacă tipul de returnare al unei metode corespunde declarației delegatului, dar argumentul este clasa ancestrală a tipului parametrului de declarație al delegatului, atunci metoda poate fi atribuită și variabilei delegate.
Dacă parametrii și tipul de returnare ale unei metode corespund presupunerilor din cele două linii de mai sus, atunci metoda poate fi atribuită și variabilei delegate.
Următorul este un exemplu simplu de covariant vs. invertor:
Covarianță:
Invertor:
|