2010-03-17 20 views
22

Sınıfımda, diğer sınıfların abone olabileceği bir etkinliği bildirmek istiyorum. Etkinliği bildirmenin doğru yolu nedir?C# olayında bir olay bildirme sözdizimi nedir?

Bu işe yaramazsa:

public event CollectMapsReportingComplete; 
+12

@IlliaRatkevych Burada bu soruyu yapmayı seviyorum, SO'nun düzeninin çoğu MSDN dökümantasyonundan daha kolay okunabiliyor. –

+10

@IlliaRatkevych Katılmıyorum - SO "uzman" programcılar için kullanılmamalıdır, tüm seviyelerde tüm geliştiricilere yardımcı olması gerekiyordu. Bu benim dürüst düşüncemde tamamen yasal bir sorudur. –

cevap

33

Sen tip söylemeyi unutmuşum. Gerçekten basit olaylar için, EventHandler yeterli olabilir:

public event EventHandler CollectMapsReportingComplete; 

Bazen (EventArgs parametresi için özel bir türü kullanmak Adam Robinson'un yorumu görmek için izin etkinlikler için kullanılmak üzere kendi temsilci türü bildirmek isteyeceksiniz):

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

public class MapEventArgs : EventArgs 
{ 
    public IEnumerable<Map> Maps { get; set; } 
} 
Ayrıca yerine kendi türlerini ilan jenerik EventHandler türü kullanabilirsiniz

:

public event EventHandler<MapEventArgs> CollectMapsReportingComplete; 
+2

Bunun için reddedilmeyecek, ancak .NET'teki kural, olay delegelerinin yalnızca bir ('object') göndereni ve 'EventArgs''dan miras kalan bir ek parametre içermesi gerektiğidir. Bunu yapmak, kendi bildirmek yerine genel 'EventHandler ' delege türünü kullanmanıza da olanak tanır. Elbette, yaklaşımınızla ilgili yanlış bir şey yoktur (bu sadece iyi çalışır), ancak hakim olan bilgelik, EventArgs tabanlı yaklaşımı desteklemektedir. –

+1

@Adam: Kesinlikle haklısınız ve cevabımı bunu yansıtacak şekilde güncelledim. –

7

Sen temsilci olayını yazın belirtmek gerekir: Burada

public event Action CollectMapsReportingComplete; 

ben System.Action kullandık ama artık istediğiniz temsilci türü (hatta özel bir temsilci) kullanabilir. Belirttiğiniz temsilci türünün bir örneği etkinlik için destek alanı olarak kullanılacaktır.

+1

EventHandler & Action arasındaki fark nedir? – Tilendor

+0

'EventHandler' ve' Action' her iki delege türüdür - istediğiniz delege türünü serbestçe belirtebilirsiniz. –

+3

'Action' kullanarak .NET standart olay sözdizimini takip etmiyor ... – thecoop

2
public event EventHandler MyEvent; 
3

Örneği

/// </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

ortak etkinlik [DelegateType] [EventName];

İlgili konular