Autor Wątek: Delegaty, eventy - niuanse  (Przeczytany 1559 razy)

Offline Karczas

  • Użytkownik
    • DevBlog

# Grudzień 26, 2007, 15:27:10
Witam. Myślę, że mój problem najlepiej przedstawi kod:

Mam sobie takie zdarzenia w jakiejś tam klasie:
        public event MessageCameDelegate onMessageCame;
        public event MessageCameDelegate OnMessageCame
        {
            add
            {
                .......
            }
            remove
            {
                .......
            }

        }

i czemu jeżeli wklepię w jakiejś metodzie tej klasy taki kod:
onMessageCame.GetInvocationList()
to wszystko działa, a jeżeli coś takiego:
OnMessageCame.GetInvocationList() to IDE krzyczy mi, że:
Error 1 The event 'Eventy_serw.CServer.OnMessageCame' can only appear on the left hand side of += or -= E:\Programowanie\C# .NET\Proby\Eventy_serw\Eventy_serw\Program.cs 14 13 Eventy_serw



Niby takie same zdarzenia o takim samym stopniu dostępu - różnica polega na tym, że jedno z akcesorami, drugie -bez. Czemu kompilator traktuje je inaczej?




Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xion

  • Moderator
    • xion.log

# Grudzień 26, 2007, 15:32:00
Zdarzenie publiczne jest przeznaczone do podpinania przez zewnętrzne klasy. Założenie jest takie, że pod zdarzenie można się podpiąć każdemu i że jest to niezależne od tego, ile metod już danego zdarzenia słucha. Ponadto kolejność wywoływania wszystkich podpiętych do zdarzenia delegatów jest nieokreślona.
Dlatego też nie potrzeba żadnej innej funkcjonalności poza operatorami += i -=, i te właśnie są udostępniane przez zdarzenia publiczne z akcesorami.

Jeżeli chodzi o różnicę, to jest taka sama jak między publicznymi polami a publicznymi właściwościami. Publiczne pola pozwalają na wszystko, właściwości będą zabraniały ustawiania jeśli nie napiszesz akcesora set. Analogicznie tutaj: piszesz jedynie akcesory add i remove, więc ta właściwość-zdarzenie pozwala tylko na dodawanie i usuwanie delegatów. Nie ma (i nie może być) akcesora get, zatem nie da się wywołać dla danego zdarzenia metody GetInvocationList() (która naruszałaby wspomnianą hermetyzację zdarzeń).

@down: Powyższy akapit powinien wyjaśnić nieco więcej :)
« Ostatnia zmiana: Grudzień 26, 2007, 15:35:36 wysłana przez Xion »

Offline Karczas

  • Użytkownik
    • DevBlog

# Grudzień 26, 2007, 15:34:28
O..teraz już ogarniam ;) Powyższy akapit wyjaśnił nieco więcej ;P
Dzięki!
« Ostatnia zmiana: Grudzień 26, 2007, 15:40:09 wysłana przez Karczas »