Sobes.tech
Junior — Middle

Ako odlíšiť delegáta od udalosti a aké sú ich hlavné rozdiely?

sobes.tech AI

Odpoveď od AI

V C# je delegát dátový typ, ktorý predstavuje odkaz na metódu s určitým podpisom. Delegáty umožňujú volanie metód nepriamo, odovzdávaním ich ako parametrov alebo ich ukladaním na neskoršie volanie.

Udalosť je mechanizmus založený na delegátoch, ktorý sa používa na oznámenie odberateľom o udalosti alebo zmene stavu. Udalosť enkapsuluje delegáta a obmedzuje prístup k nemu: odberatelia môžu len pridávať alebo odstraňovať spracovateľov, ale nemôžu volať udalosť priamo.

Hlavné rozdiely:

  • Delegát je typ, udalosť je člen triedy, ktorý používa delegáta.
  • Delegát môže byť volaný priamo, udalosť nie (volanie udalosti je možné iba v rámci triedy, kde je deklarovaná).
  • Udalosť zabezpečuje enkapsuláciu a bezpečnosť, zabraňuje ľubovoľným volaniam spracovateľov zvonku.

Príklad:

public delegate void Notify(string message); // delegát

public class Process
{
    public event Notify ProcessCompleted; // udalosť

    public void Start()
    {
        // ... vykonanie procesu
        OnProcessCompleted("Proces ukončený");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // volanie udalosti
    }
}

// Použitie:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // prihlásenie
process.Start();