farklılıkları anlamak için bu 2 örneğe bakabilirsiniz
Temsilcilerle Örnek (Bu durumda, değer döndürmeyen bir tür temsilci olan eylem)
public class Animal
{
public Action Run {get; set;}
public void RaiseEvent()
{
if (Run != null)
{
Run();
}
}
}
Temsilciyi kullanmak için böyle bir şey yapmalısınız
Animale animal= new Animal();
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running") ;
animal.RaiseEvent();
bu kod iyi çalışıyor ancak bazı zayıf noktalarınız olabilir.
Örneğin bunu yazarsam
animal.Run += () => Console.WriteLine("I'm running");
animal.Run += () => Console.WriteLine("I'm still running");
animal.Run = () => Console.WriteLine("I'm sleeping") ;
son kod satırıyla önceki davranışları geçersiz kıldığımdan yalnızca biri eksik +
( +
yerine kullandım +=
)
Başka bir zayıf nokta sizin kullandığınız her sınıf olmasıdır Animal
sınıfını yükseltebilirsiniz RaiseEvent
çağırarak sadece animal.RaiseEvent()
.
Bu zayıf noktalardan kaçınmak için events
c # ' da kullanabilirsiniz .
Hayvan sınıfınız bu şekilde değişecek
public class ArgsSpecial :EventArgs
{
public ArgsSpecial (string val)
{
Operation=val;
}
public string Operation {get; set;}
}
public class Animal
{
public event EventHandler<ArgsSpecial> Run = delegate{} //empty delegate. In this way you are sure that value is always != null because no one outside of the class can change it
public void RaiseEvent()
{
Run(this, new ArgsSpecial("Run faster"));
}
}
olayları aramak için
Animale animal= new Animal();
animal.Run += (sender, e) => Console.WriteLine("I'm running. My value is {0}", e.Operation);
animal.RaiseEvent();
Farklılıklar:
- Bir genel mülk değil, genel bir alan kullanıyorsunuz (olaylarla, derleyici alanlarınızı istenmeyen erişime karşı korur)
- Olaylar doğrudan atanamaz. Bu durumda, davranışı geçersiz kılarak gösterdiğim önceki hatayı yapamazsınız.
- Sınıfınızın dışından hiç kimse etkinliği düzenleyemez.
- Olaylar bir arayüz bildirimine dahil edilebilirken bir alan olamaz
notlar
EventHandler aşağıdaki temsilci olarak bildirildi:
public delegate void EventHandler (object sender, EventArgs e)
bir göndereni (Nesne tipinde) ve olay argümanlarını alır. Statik yöntemlerden geliyorsa gönderen boştur.
Bunun EventHAndler
yerine şu örneği de kullanabilirsiniz:EventHandler<ArgsSpecial>
EventHandler ile ilgili belgeler için buraya bakın