2010-07-28 11 views
13
public void Bar() 
{ 
    Foo foo = new Foo(); 
    **foo.MyEvent += foo_MyEvent;** 
    foo.FireEvent();   
} 

void foo_MyEvent(object sender, EventArgs e) 
{ 
    ((Foo)sender).MyEvent -= foo_MyEvent; 
} 

Hej, jestem trochę obeznany z wydarzeniami, czy ktoś może mi powiedzieć, co robi operator + = z wydarzeniami?+ = operator ze Zdarzeniami

Odpowiedz

31

+= subskrybuje wydarzenie. Delegat lub metoda po prawej stronie += zostanie dodana do wewnętrznej listy, którą zdarzenie śledzi, a gdy klasa posiadająca je wywoła to zdarzenie, wszyscy delegaci z listy zostaną wywołani.

+15

oraz '- =' wypisuje się z nazwy – CaffGeek

0

Dodaje obsługę do zdarzenia. Oznacza to, że metoda po prawej stronie operatora zostanie wywołana, gdy wydarzenie zostanie podniesione.

1

W tym przypadku metoda foo_MyEvent będzie ogień whene że zdarzenie jest nazywany (aby zapisać się do imprezy w wierszu 4)

17

Odpowiedź zaakceptowaniu jest miłym uproszczoną wersją co += robi, ale to nie jest pełna historia.

Operator += wywołuje metodę dodawania zdarzenia. Podobnie, usuń połączenia -=. To zwykle powoduje, że delegat jest dodawany do wewnętrznej listy handlerów, które są wywoływane, gdy zdarzenie jest uruchamiane, ale nie zawsze nie zawsze.

Jest całkowicie możliwe zdefiniowanie dodawania do zrobienia czegoś innego. Przykład ten może przyczynić się do wykazania, co się dzieje, kiedy zadzwonić +=:

class Test 
{ 
    public event EventHandler MyEvent 
    { 
     add 
     { 
      Console.WriteLine("add operation"); 
     } 

     remove 
     { 
      Console.WriteLine("remove operation"); 
     } 
    }  

    static void Main() 
    { 
     Test t = new Test(); 

     t.MyEvent += new EventHandler (t.DoNothing); 
     t.MyEvent -= null; 
    } 

    void DoNothing (object sender, EventArgs e) 
    { 
    } 
} 

wyjściowa: artykuł

 
add operation 
remove operation 

zobaczyć występ Jon Skeet w sprawie events and delegates aby uzyskać więcej informacji.

+1

To jest dokładne. Moja odpowiedź powinna odzwierciedlać zachowanie wszystkich zdarzeń, które można znaleźć na lekcjach framework, ale może nie być tym, co się stanie, jeśli zasubskrybujesz wydarzenie kogoś innego. – mquander

1

Zdarzenie jest po prostu niezmienną listą uczestników (to znaczy subskrybentów, którzy zostaną wywołani, gdy coś opublikuje/wywoła to zdarzenie). Można by argumentować, że moglibyśmy zamiast tego użyć Listy. Gdybyśmy poszli tą drogą, ktoś mógłby hartować się z naszymi subskrybentami.

W powyższym scenariuszu gdzie użyć listy, można zrobić:

lstDelegate = newDelegate

i zostały wymazane istniejących abonentów (lstDelegate zawiera tylko ur delegata zwrotnego teraz).

Aby zatrzymać tę przygodę, mamy wydarzenie. Kiedy używasz zdarzenia, kompilator nie pozwoli ci tego zrobić, możesz dodawać/usuwać własnego delegata za pomocą + = i - =. I tak próbuję to rozróżnić. mam nadzieję, że to pomoże.

Powiązane problemy