2011-02-08 25 views
5

Tüm .NET kitabında, olayları uygulamak için kılavuz çizgisini okudum, EventArgs sınıfını alt sınıflara ayırmanız ve EventHandler'ı kullanmanız gerektiğini açıklıyor. http://msdn.microsoft.com/en-us/library/ms229011.aspx ile ilgili daha fazla bilgi araştırdım ve "Olay işleyicileri olarak kullanılmak üzere el ile yeni delegeler oluşturmak yerine System.EventHandler kullan" diyor. EventArgs'ı kullanmanın önemli nedenleri olduğunu anlıyorum, ancak sorum "Bu şekilde yapmalı mıyım?" Değil, "Bunu böyle yapabilir miyim?".EventArgs sınıfı ve etkinlik anahtar kelimesi arasında özel bir ilişki var mı?

Etkinliklerim ile EventHandler yerine genel bir temsilci kullanamamın bir nedeni var mı? Örneğin, güçlü bir şekilde yazılan bir gönderen varsa (bu kişi object sender tarafından rahatsız mı geliyor?).

Neyi daha iyi ifade ettiğimi açıklamak için, aşağıdakiler işe yaramayacak herhangi bir sebep var mı?

public class IoC 
{ 
    public AbstractFactory GetAbstractFactory() 
    { 
     var factory = new AbstractFactory(); 
     factory.CreateObject +=()=>new object(); 
     return factory; 
    } 
} 
public class AbstractFactory 
{ 
    public event Func<object> CreateObject; 

    private object OnObjectCreated() 
    { 
     if(CreateObject == null) 
     { 
      throw new Exception("Not injected."); 
     } 
     return CreateObject(); 
    } 


    private object _injectedObject; 
    public object InjectedObject 
    { 
     get 
     { 
      if(_injectedObject == null) 
      { 
       _injectedObject = OnObjectCreated(); 
      } 
      return _injectedObject; 
     } 
    } 
} 
+0

Gözlemlenebilir bir koleksiyona benzer bir şeyi uygulamak için bunu tam olarak yaptım. – asawyer

+0

İlgili konu: http://stackoverflow.com/questions/4828212/should-eventhandler-always-be-used-for-events/4828233 – CodesInChaos

cevap

5

Bu yalnızca bir kuraldır ve dil gereksinimi yoktur. Herhangi bir temsilci türünü etkinlik olarak kullanabilirsiniz.

standart EventHandler<T> imza olsa birkaç avantajı vardır: Sen EventArgs parametreyi uzatabilirsiniz

  1. . Eventhandler'a geçmek istediğiniz her şey için bir parametreniz varsa bu işe yaramaz. EventArgs taban sınıfı tüm olayların görünen EventHandler<T> için Uzatma yöntemleri ekleyebilirsiniz
  2. kongre aşağıdaki herhangi bir olay için abone olabilirsiniz kabul
  3. Bir EventHandler.
  4. İade türü void'dir. Diğer iade türleri, eventhandlers kadar anlam ifade etmiyor.
  5. Sözleşmeyi takip ediyorsunuz. Sözleşmeyi takiben, zorlayıcı argümanlara sahip değilseniz, genellikle iyi bir fikirdir.
3

Microsoft'un tüm belgeleri, temel sınıf kitaplıklarının ve/veya genel çerçeve tasarım yönergelerinin tasarımıyla ilgilidir. İstediğiniz herhangi bir deseni kullanabilirsiniz.

Bu, eğer insanlar kodunuzu tüketeceklerse, Microsoft'un kullandığı kalıpları izlerseniz onlara daha aşina olacaklarını söyledi.

0

Bildiğim kadarıyla, EventHandler ve EventArgs en iyi uygulamalardır, ancak bir etkinlik bildiriminde herhangi bir keyfi temsilci kullanmanızın engelleneceği hiçbir şey yoktur. Olay anahtar sözcüğü size, yalnızca bir delegeyi kabul eden bir alan ya da mülküne sahip olmanın aksine, etkinlik deliğine + = ve - = delegeler verebilmeniz için özel işlevsellik verir (birden çok delege oluşturmazsanız). kendin).

Uyarı: Bir olay yuvasındaki dönüş değerleri olan delegelere ne olacağından emin değilim. Benim tahminim geri dönüş değerleri atılır, çünkü etkinliğe atanan geri dönüş değerlerine sahip birden fazla delegenin ele alınması zor olacaktır. Bu olsa da bazı deneme gerektirir.

+0

Son değer döndürülür. Ama bu sadece işe yaramaz. –

İlgili konular