Eveniment delegat și ceea ce este revărsarea diferența stivă în limba rusă

Să începem cu faptul că evenimentul și delegatului - este de două lucruri diferite, la fel de diferite ca masina si morcovi. Diferența dintre teren și event'om -delegatom este de aproximativ aceeași ca între teren și proprietate: eveniment, uneori, arata ca delegatnoe câmp. Să vedem acest lucru.

delege - această clasă. care conține o metodă de „șablon“, adică, metoda semnăturii. Variabila de tip delegatnogo - tip de obiect MulticastDelegate (mai precis, un derivat al acestuia), care poate conține una sau mai multe obiecte, care sunt compatibile cu metodele „șablon“ semnătură (bit counter și covarianța complică imaginea). Asta este, este ca o variabilă care poate conține funcții. Pentru aceste variabile definite de operare +. care combină funcțiile de termeni într-o nouă funcție și o operațiune simetrică -. Aceste operații sunt generează automat instrumente derivate și funcționarea + = - =.

evenimentul - este doar o pereche de metode din clasa desemnate ca adăugați și eliminați. și având o semantică arbitrar selectat de programator. (Comparație -. Getter și setter proprietăți) Implementarea implicită pentru Starts juke delegatnogo tip câmp ascuns, și adăugați / eliminați adăugate sau eliminate din acestea metode (sub lock'om). (Pentru a confunda imaginea un pic, este un câmp ascuns este disponibil în același nume ca evenimentul.) Funcțiile de adăugare / eliminare. componente ale evenimentului. sunt invocate, respectiv, și modul în care + = - =. Nici o operație + / -. Desigur, nr.

Să mergem chiar peste diferența în domeniul juke-clasă de tip delegatnogo publice.

Considerați cazul în care evenimentul este pus în aplicare „în mod implicit“, adică, cu un câmp delegatnym implicit. Diferența constă în faptul că:

1) Pentru delegatnogo câmp aveți acces deplin la ea. Puteți, - de asemenea, în afara clasei! - MulticastDelegate demontat în părți și de a colecta noi, o puteți înlocui pe cont propriu sau atribui un nul. puteți apela, ea se poate copia la o variabilă. Ai acces deplin, precum și la orice domeniu public. (Acest lucru, desigur, încalcă flagrant incapsulare.)

Pentru tonomat, puteți scrie doar instance.Event + = handler și instance.Event - = handler. care este afișat pe adăugați și eliminați. care, la rândul său, din nou, a făcut apel + = și - = a pus în aplicare în mod automat delegat. Nici un alt acces nu trebuie. În cadrul clasei, puteți, cu toate acestea, pentru a primi pentru a citi valoarea delegatului, folosind numele tonomat. (Acest lucru este necesar, de exemplu, pentru a apela delegat, VB, spre deosebire de C # are un RaiseEvent special metoda cu verificările necesare.)

Pentru cazul în care evenimentul nu se produce „implicit“, nu există practic nimic în comun. adăugați și să eliminați metode pot face orice:

Programatorul poate face singur un delegat și „adăugați“ la manipulatorii semnate, dar este, în principiu, fondul comercial său. Pe de altă parte, este recomandat să nu se rupă de așteptat clienții semantica de clasă, și de a folosi evenimentul conform destinației.

* În versiunile moderne ale C # pentru a apela un model recomandat MyEvent thread-safe? .Invoke (.). Cu toate acestea, cu fir de siguranță în cazul în care nu se întâmplă fără probleme, așa cum se explică în articolul [2].

articole similare