2012-02-03 17 views

Odpowiedz

6

C# Events to specyficzna forma delegates. Jeśli programowałeś w innych językach, takich jak C++, możesz porównać wskaźnik delegate ze wskaźnikiem funkcji ("metody") - wskazuje on na jakiś kod w pamięci. Kiedy wywołujesz wskaźnik jako metodę, faktycznie wywołujesz metodę pod adresem wskazywanym przez wskaźnik.

Jest to konieczne, aby zapewnić oddzielenie między dzwoniącym a odbiorcą - więc nie musisz mieć wszystkich metod gotowych, gdy publikujesz kod, który je wywołuje (co nie byłoby możliwe - formanty kontrolujące programistów mogą ". t ewentualnie znać kod, który musi zostać wywołany po naciśnięciu klawisza Button). Wywołujesz wskaźnik, a inny programista ustawia go później na odpowiedni adres pamięci.

P.S. delegates i Events mają jednak inne zalety w porównaniu z prostymi wskaźnikami funkcyjnymi - możesz być pewny, że wskaże ona dobrze wyglądającą metodę, przyjmując poprawną liczbę i typ argumentów i zwracając poprawny typ.

3

Zdarzenie w języku C# jest sposobem na zapewnienie przez klasę powiadomień klientom tej klasy, gdy coś interesującego dzieje się z obiektem.

http://msdn.microsoft.com/en-us/library/aa645739%28v=vs.71%29.aspx

Sposób jest blokiem kodu zawierające szereg instrukcji. W języku C# każda wykonywana instrukcja jest wykonywana w kontekście metody.

http://msdn.microsoft.com/en-us/library/ms173114%28v=vs.80%29.aspx

+2

Straszna odpowiedź na złe pytanie ... Nawet ja nie rozumiem twojego wyjaśnienia wydarzeń i mam * lata * doświadczenia z C#! –

+0

@ Vladislav Zorov Doceń opinię. Czy możesz dać nam znać lepszy sposób na odpowiedź na tak podstawowe pytanie? –

+1

Żałuję, że nie mogłem zgodzić się z odpowiedzią Validislava Zorova. Może po prostu angielski nie jest twoją rzeczą? To takie proste wyjaśnienie. Wykonałem P.K. – sereschkin

10

Sposób to kod zawarty w klasie realizacji kawałek funkcjonalności. Cały kod w języku C# jest zawarty w metodach.

Jeśli chodzi o wydarzenia, to przypuśćmy, że masz prostą klasę, która zaimplementowała licznik (możesz nazwać go obiektem Counter). Załóżmy teraz, że chcesz, aby inne obiekty nie były powiązane z Counter, gdy liczba osiągnęła 100. Jak byś to zrobił?

Logicznym rozwiązaniem byłoby umożliwienie innych obiektów, aby określić jeden z ich własnychmetodami chcą być wywołana, gdy licznik osiągnie 100. Każdy obiekt może następnie indywidualnie powiedzieć obiekt Counter która metoda chcą Zostać wezwanym. Obiekt Counter zapisuje tę listę metod, a gdy liczba osiągnie 100, wywołuje każdą z zapisanych metod po kolei.

To jest sposób działania zdarzeń - klasa Counter zawiera element zdarzenia (o nazwie powiedz: CounterIs100), do którego inne instancje obiektu łączą jedną z własnych metod. Gdy obiekt Counter wykryje, że osiągnął 100, to wywołuje członka CounterIs100, który automatycznie wywołuje wszystkie metody aktualnie z nim powiązane, powiadamiając każdy obiekt po kolei, że liczba rzeczywiście osiągnęła 100. Jeśli nie ma obiektów połączyli metodę z elementem zdarzenia CounterIs100, będzie to null, więc nie jest konieczne, aby obiekt Counter wywoływał element zdarzenia.

class Counter 
{ 
    // this is the count field used to save the current count value 
    private int count; 

    // this is the event member which holds all the methods other objects have specified 
    public event CounterIs100Delegate CounterIs100; 

    // This is a method. It invokes the CounterIs100 event member if anyone has subscribed to it 
    protected void OnCounterIs100() 
    { 
     // see if anyone has subscribed (linked) their method to this event 
     if (CounterIs100 != null) 
     { 
      // invoke the event - this will call all subscribed methods 
      CounterIs100(); 
     } 
    } 

    // This is a method. It increments the counter variable stored by this object 
    public void Increment() 
    { 
     count++; 
     // if the count is 100, invoke the event 
     if (count == 100) 
     OnCounterIs100(); 
    } 

} 

// This is a delegate. It is used to define a template for other objects wishing to 
// subscribe to the CounterIs100 event. The methods other objects link to the 
// CounterIs100 event must match this declaration (although the name can be changed) 
public delegate void CounterIs100Delegate(); 

// This is a class, unrelated to Counter, but uses its events 
class SiteHits 
{ 
    Counter hitCounter = new Counter(); 

    public SiteHits() 
    { 
     // We want to know when the number of site hits reaches 100. 
     // We could monitor this ourselves, but we know the Counter class already 
     // does this, so we just link our method to its event 
     hitCounter.CounterIs100 += this.WhenSiteHitsReaches100; 
    } 

    public void PageRequested() 
    { 
     // someone has requested a page - increment the hit counter 
     Console.WriteLine("We've been hit!"); 
     hitCounter.Increment();    
    } 

    // this is the method we want called when the CounterIs100 event occurs. 
    // note that the return value and parameters match CounterIs100Delegate above. 
    public void WhenSiteHitsReaches100() 
    { 
     Console.WriteLine("Woohoo! We've reached 100 hits!"); 
    } 
} 
+0

Innym sposobem powiadamiania byłoby użycie wzorca Obserwatora. Następnie możesz zaimplementować ten sam kod bez zdarzeń. Dlaczego korzystasz z wydarzeń, a nie z wzoru Obserwatora? –

+0

@CodePope, ponieważ ta odpowiedź została zakodowana prawie 6 lat temu. Paradygmaty kodowania zmieniają się w czasie. – adelphus

+0

Wzorzec obserwatora jest znacznie starszy niż sześć lat. To było w tamtym czasie, kiedy napisałeś swoją odpowiedź –

0

Zdarzenie w .net jest parą metod, jedną dla "Dodaj" i jedną dla "Usuń", z których każda akceptuje delegata. Zwykle metoda "Dodaj" pobiera przekazaną delegatę i dodaje ją do listy delegatów lub MulticastDelegate; przekazanie delegata do zdarzenia "Usuń", które wcześniej zostało przekazane do metody "Dodaj", powinno usunąć tego delegata z listy. Jeśli ktoś nie zażąda inaczej, zarówno C#, jak i vb.net domyślnie automatycznie utworzą zdarzenia "Dodaj" i "Usuń", które będą zachowywać się jak wskazano powyżej.

Powiązane problemy