Wednesday, August 12, 2020 23:35

Cuprins >> Delegați, Expresii Lambda, Evenimente > Evenimente: Add și Remove

Evenimente: Add și Remove

În lecția anterioară v-am arătat modul în care compilatorul implementează concret evenimentele, adăugând de fapt în fundal două metode numite addon() și removeon() și făcând câmpul Action privat, astfel încât să nu îl putem invoca în mod direct. Dar acest lucru a fost efectuat în limbajul MSIL, iar noi nu trebuie să ne preocupăm cu un nivel atât de jos. În această lecție, vă voi arăta cum putem face exact același lucru folosind limbajul C# obișnuit, în caz că avem nevoie de mai mult control asupra modului în care sunt implementate evenimentele noastre.

Să luăm din nou codul pe care l-am avut în lecția precedentă:

Și acum, să refacem toți pașii pe care compilatorul i-a făcut în mod automat – mai întâi, să facem acțiunea noastră privată, astfel încât să nu poată fi invocată direct:

De asemenea, am schimbat numele acțiunii astfel încât să înceapă cu o minusculă, pentru ca mai târziu să nu avem un conflict de nume.

Pasul doi – adăugați un eveniment public:

Veți observa cu siguranță noua modalitate de declarare a delegatului meu: dintr-o dată, declarația evenimentului meu are un corp, iar în interiorul său adaug două blocuri, add și remove. Acesta este modul C# de a ne permite să facem exact același lucru pe care îl făceau automat addon() și removeon(). În aceste corpuri ne putem abona și dezabona la Acțiunea noastră privată, folosind un parametru fantomă numit value (prezent și la declararea unei proprietăți). Pentru a testa acest lucru, să testăm dacă aceste blocuri sunt executate atunci când ceva subscrie sau se dezabonează la evenimentele noastre:

Explicația este simplă: abonăm o metodă la o acțiune privată folosind blocurile de eveniment add și remove, care este exact același lucru pe care compilatorul îl face automat, dacă nu specificăm manual blocuri de adăugare și eliminare. Dar, specificându-le, avem un control mai mare, deoarece brusc, putem implementa logică atunci când adăugăm sau eliminăm abonați la un eveniment, cum ar fi de exemplu să verificăm dacă metoda abonată îndeplinește unele cerințe, sau logarea acțiunilor efectuate, sau abonarea metodei mai mult de o singură dată, sau orice altceva dorim.

Rezultatul codului de mai sus va arăta astfel:

C# evenimente: add și remove

În acest moment, începeți să înțelegeți factul că evenimentul este doar o interfață față de Acțiunea noastră privată, astfel încât să putem controla cine și când invocă respectiva Acțiune și, folosind membrii add și remove ai evenimentelor, putem de asemenea controla cine se poate abona sau dezabona la Acțiune, când poate face acest lucru, în ce condiții, etc. Acest lucru ne oferă cu adevărat tot controlul pe care l-am putea dori atunci când vine vorba de a lucra în siguranță cu delegații.

Este adevărat, de cele mai multe ori, nu veți avea nevoie de acest grad de control, folosind un eveniment într-o manieră simplă, ca în exemplul din lecția precedentă, este mai mult decât suficient pentru majoritatea cazurilor din viața de zi cu zi.

Comments

comments

Tags: , , , , , ,

Leave a Reply



Do NOT follow this link or you will be banned from the site!