2010-03-17 15 views
22

W mojej klasie chcę zadeklarować wydarzenie, które inne klasy mogą subskrybować. Jaki jest prawidłowy sposób deklarowania zdarzenia?Jaka jest składnia deklarowania zdarzenia w języku C#?

To nie działa:

public event CollectMapsReportingComplete; 
+12

@IlliaRatkevych Podoba mi się posiadanie tego pytania tutaj, układ SO jest łatwiejszy do przeczytania niż większość dokumentacji MSDN. –

+10

@IlliaRatkevych Nie zgadzam się - SO nie jest przeznaczone do użycia dla "ekspertów" programistów, ma pomóc wszystkim programistom na wszystkich poziomach. To jest całkowicie uzasadnione pytanie w mojej uczciwej opinii. –

Odpowiedz

33

zapomniałeś wspomnieć typ. Dla naprawdę prostych zdarzeń, EventHandler może wystarczyć:

public event EventHandler CollectMapsReportingComplete; 

Czasami będziesz chciał zadeklarować swój własny typ delegata do wykorzystania dla swoich imprez, dzięki czemu można użyć niestandardowego typu parametru EventArgs (patrz komentarz Adama Robinsona):

public delegate void CollectEventHandler(object source, MapEventArgs args); 

public class MapEventArgs : EventArgs 
{ 
    public IEnumerable<Map> Maps { get; set; } 
} 

można również użyć rodzajowe EventHandler typ zamiast deklarowania własnych typów:

public event EventHandler<MapEventArgs> CollectMapsReportingComplete; 
+2

Nie pójdziemy na to, ale konwencja w .NET jest taka, że ​​delegaci zdarzeń powinni zawierać tylko nadawcę ("obiekt") i jeden dodatkowy parametr, który dziedziczy po 'EventArgs'. Wykonanie tej czynności umożliwi także użycie ogólnego typu 'EventHandler ' zamiast typu deklaracji. Nie ma oczywiście nic złego w twoim podejściu (będzie działać dobrze), ale dominująca mądrość faworyzuje podejście oparte na EventArgs. –

+1

@Adam: Masz absolutną rację, i zaktualizowałem swoją odpowiedź, aby to odzwierciedlić. –

7

musisz określić typ delegata zdarzenia:

public event Action CollectMapsReportingComplete; 

Tutaj użyłem System.Action ale można użyć dowolnego typu delegata chcesz (nawet zwyczaj delegata). Wystąpienie określonego typu delegata będzie używane jako pole zaplecza dla zdarzenia.

+1

Jaka jest różnica między EventHandler & Action? – Tilendor

+0

'EventHandler' i' Action' są typami delegowanymi - możesz dowolnie określić dowolny typ uczestnika. –

+3

użycie 'akcji' nie jest zgodne ze składnią zdarzeń standardu .NET ... – thecoop

2
public event EventHandler MyEvent; 
3

Przykład

/// </summary> 
/// Event triggered when a search is entered in any <see cref="SearchPanel"/> 
/// </summary> 
public event EventHandler<string> SearchEntered 
{ 
    add { searchevent += value; } 
    remove { searchevent -= value; } 
} 
private event EventHandler<string> searchevent; 
0

zdarzenie publicznych [DelegateType] [EventName];

Powiązane problemy