Sobes.tech
Junior — Middle

Jak odróżnić delegata od zdarzenia i jakie są ich główne różnice?

sobes.tech AI

Odpowiedź od AI

W C# delegacie jest typem, który reprezentuje odwołanie do metody o określonej sygnaturze. Delegaty umożliwiają wywoływanie metod pośrednio, przekazując je jako parametry lub zapisując do późniejszego wywołania.

Zdarzenie to mechanizm oparty na delegatach, używany do powiadamiania subskrybentów o wystąpieniu jakiegoś działania lub zmianie stanu. Zdarzenie enkapsuluje delegata i ogranicza dostęp do niego: subskrybenci mogą tylko dodawać lub usuwać obsługiwacze, ale nie mogą wywołać zdarzenia bezpośrednio.

Główne różnice:

  • Delegat to typ, zdarzenie to członek klasy korzystający z delegata.
  • Delegat może być wywołany bezpośrednio, zdarzenie nie (wywołanie zdarzenia jest możliwe tylko w klasie, w której jest zadeklarowane).
  • Zdarzenie zapewnia enkapsulację i bezpieczeństwo, zapobiegając arbitralnym wywołaniom obsługiwaczy z zewnątrz.

Przykład:

public delegate void Notify(string message); // delegat

public class Process
{
    public event Notify ProcessCompleted; // zdarzenie

    public void Start()
    {
        // ... wykonanie procesu
        OnProcessCompleted("Proces zakończony");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // wywołanie zdarzenia
    }
}

// Użycie:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // subskrypcja
process.Start();