Rozdíly mezi událostmi a delegáty
- 7. Listopad 2010
- Publikováno v C#
- Napište komentář
Nebudu psát o tom co jsou to delegáti a události v C#, ale shrnu jejich podobné a rozdílné rysy.
Kus zdrojového kódu bude výřečnější než já ![]()
{
public delegate void MyEventHandler(String message);
class MyClass
{
//událost
public event MyEventHandler MyEventA;
//událost přidává k delegátovi přístupové metody add a remove,
//které je možné využít k implementaci vlastního úložiště události
public event MyEventHandler MyEventB
{
add
{
_myEventStorage += value;
}
remove
{
_myEventStorage -= value;
}
}
//úložiště události
private MyEventHandler _myEventStorage;
//pouhý delegát
public MyEventHandler MyDelegate;
public void RaiseEvents()
{
if (MyEventA != null)
{
MyEventA("Event A");
}
if (_myEventStorage != null)
{
_myEventStorage("Event B");
}
if (MyDelegate != null)
{
MyDelegate("Delegate");
}
//tady se události a delegáti volali podobně
}
}
}
{
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
mc.MyEventA += HandlerA;
mc.MyEventA += HandlerB;
mc.MyDelegate += HandlerA;
mc.MyDelegate += HandlerB;
mc.RaiseEvents();
//zatím to vypadalo že delegáti a události se používají stejně
//Události můžeme volat pouze ze třídy, ve které byly deklarované.
//Nelze je volat ani z odvozené třídy.
//následující řádek by tedy nešel přeložit
//mc.MyEventA("Progam");
// volání delegáta je omezeno pouze modifikátory přístupu
mc.MyDelegate("Program");
//do události nemůžeme nic přiřadit pomocí "rovná se", (+=, -= je samozřejmě v pohodě)
//následující řádek by tedy nešel přeložit
//mc.MyEventA = null;
mc.MyDelegate = null;
mc.RaiseEvents();
Console.ReadKey();
}
public static void HandlerA(String message)
{
Console.WriteLine("Handler A - "+message);
}
public static void HandlerB(String message)
{
Console.WriteLine("Hadnler B - "+message);
}
}
}
{
event MyEventHandler MyEventA;
//delegát nemůže být definován v rozhraní
//následující řádek by nešel přeložit
//MyEventHandler MyEventB;
}
Ze zdrojových kódů by mělo vyplynout, že klíčové slovo event přidává k delegátovi několik omezení (nemožnost přiřadit pomocí = ; nemožnost volat odjinut než ze třídy, kde je deklarován) a několik nových možností (využít přístupové metody add a remove; definovat událost v rozhraní).
Dosud žádný komentář.