Mam pewne zamieszanie dotyczące Events
. Jakie są podstawowe różnice między zdarzeniami i metodami C#?Różnica między zdarzeniami i metodami
Odpowiedz
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.
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
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!");
}
}
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? –
@CodePope, ponieważ ta odpowiedź została zakodowana prawie 6 lat temu. Paradygmaty kodowania zmieniają się w czasie. – adelphus
Wzorzec obserwatora jest znacznie starszy niż sześć lat. To było w tamtym czasie, kiedy napisałeś swoją odpowiedź –
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.
- 1. Różnica między metodami zdarzenia jquery.simulate.js i jQuery?
- 2. Jaka jest różnica między wyzwalaczami i zdarzeniami w sieci szkieletowej?
- 3. Jaka jest różnica między zdarzeniami Control.Enter i Control.GotFocus?
- 4. Jaka jest różnica między zdarzeniami w VB i C#?
- 5. Jaka jest różnica między metodami rysowania KineticJS?
- 6. Różnica między metodami onCreateView Preferencji a onBindView
- 7. Jaka jest różnica między tymi dwoma metodami?
- 8. Różnica między metodami onKey(), OnKeyDown() i dispatchKeyEvent() dostarczanymi przez Androida?
- 9. Jaka jest różnica między metodami iteratora i widoku?
- 10. redis-py: Jaka jest różnica między metodami StrictRedis() i Redis()?
- 11. Jaka jest różnica między metodami Html.Partial i Html.Action?
- 12. Jaka jest różnica między metodami len() i sys.getsizeof() w pythonie?
- 13. Jaka jest różnica między metodami DeleteObject() i Recycle() dla SP.Folder
- 14. Jaka jest różnica między metodami invalid() i postInvalidate() systemu Android?
- 15. Jaka jest różnica między metodami i atrybutami w Ruby?
- 16. Java: Różnica między metodami setPreferredSize() i setSize() w komponentach
- 17. Jaka jest różnica między metodami dynamicznymi i wirtualnymi?
- 18. Różnica między atrybutami i metodami JSON w szkielecie
- 19. Różnica między asfreq i resample
- 20. Jaka jest różnica między 5 metodami konfiguracji Magical Record?
- 21. Jaka jest różnica między różnymi metodami * get helper * w Magento?
- 22. Jaka jest różnica między tymi metodami przypisywania nazw?
- 23. Jaka jest różnica między tymi dwoma metodami tworzenia obiektów?
- 24. Różnica między SqlDataReader.Read i SqlDataReader.NextResult
- 25. Różnica między getGenericParameterTypes i getParameterTypes
- 26. Różnica między getString() i getResources.getString()
- 27. Różnica między AuthorizeAttribute i IAuthenticationFilter
- 28. Różnica między Find i FindAsync
- 29. Scrapy: Przechodząc pozycję między metodami
- 30. Jaka jest różnica między zdarzeniami końca i końca w strumieniach węzła
Straszna odpowiedź na złe pytanie ... Nawet ja nie rozumiem twojego wyjaśnienia wydarzeń i mam * lata * doświadczenia z C#! –
@ Vladislav Zorov Doceń opinię. Czy możesz dać nam znać lepszy sposób na odpowiedź na tak podstawowe pytanie? –
Ż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