Sobes.tech
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 event kulcsszó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 EventHandler vagy EventHandler<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.