Junior
Mi az események a C#-ban?
sobes.tech MI
Válasz az MI-től
A C#-ban lévő események egy "megfigyelő" (Observer Pattern) mintán alapuló mechanizmus, amely lehetővé teszi egy objektum (kiadó) számára, hogy értesítse más objektumokat (feliratkozókat) egy adott művelet vagy állapotváltozás bekövetkezéséről.
Fő összetevők:
- Kiadó (Publisher): Osztály, amely eseményt deklarál.
- Esemény (Event): Az
eventkulcsszóval deklarált esemény. Meghatározza a metódus szignatúráját, amelyet a kezelők használnak. - Delegált (Delegate): Olyan típus, amely meghatározza az eseményhez feliratkozó metódusok szignatúráját. Gyakran használt előre definiált delegált a
EventHandlervagyEventHandler<TEventArgs>. - Feliratkozó (Subscriber): Osztály vagy objektum, amely feliratkozik a kiadó eseményére, és egy (az esemény kezelője) metódust biztosít, amelyet az esemény bekövetkeztekor hívnak.
- Esemény kezelő (Event Handler): A feliratkozó metódusa, amely megfelel az esemény delegátjának szignatúrájának.
Példa deklarációra és használatra:
// Delegátus deklarálása, ha nem használjuk az előre definiált EventHandler-t
public delegate void MyEventHandler(object sender, EventArgs e);
// Kiadó osztály
public class Publisher
{
// Esemény deklarálása delegátussal
public event MyEventHandler MyEvent;
public void DoSomething()
{
// Esemény kiváltása (ha vannak feliratkozók)
OnMyEvent(EventArgs.Empty);
}
// Metódus az esemény kiváltására (védett null értéktől)
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
// Feliratkozó osztály
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
// Feliratkozás az eseményre
publisher.MyEvent += HandleMyEvent;
}
public void Unsubscribe(Publisher publisher)
{
// Lemondás az eseményről
publisher.MyEvent -= HandleMyEvent;
}
// Esemény kezelő
private void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("Az esemény megtörtént!");
}
}
// Használati példa
public class Program
{
public static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub = new Subscriber();
sub.Subscribe(pub); // Feliratkozás
pub.DoSomething(); // Esemény kiváltása
sub.Unsubscribe(pub); // Lemondás (opcionális)
}
}
Az események gyenge kapcsolódást (loose coupling) biztosítanak az objektumok között, lehetővé téve számukra, hogy anélkül kommunikáljanak egymással, hogy közvetlenül ismernék egymás implementációját.