Sobes.tech
Junior — Middle

Jak rozlišit delegáta od události a jaké jsou jejich hlavní rozdíly?

sobes.tech AI

Odpověď od AI

V C# je delegát datový typ, který představuje odkaz na metodu s určitým podpisem. Delegáty umožňují volat metody nepřímo, předáváním je jako parametrů nebo jejich ukládáním pro pozdější volání.

Událost je mechanismus založený na delegátech, který se používá k oznámení odběratelům o události nebo změně stavu. Událost enkapsuluje delegáta a omezuje přístup k němu: odběratelé mohou pouze přidávat nebo odstraňovat obslužné rutiny, ale nemohou událost přímo vyvolat.

Hlavní rozdíly:

  • Delegát je typ, událost je člen třídy, který používá delegáta.
  • Delegát může být volán přímo, událost nikoli (volání události je možné pouze uvnitř třídy, kde je deklarována).
  • Událost zajišťuje enkapsulaci a bezpečnost, zabraňuje libovolnému volání obslužných rutin zvenčí.

Příklad:

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

public class Process
{
    public event Notify ProcessCompleted; // událost

    public void Start()
    {
        // ... provádění procesu
        OnProcessCompleted("Proces dokončen");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // volání události
    }
}

// Použití:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // přihlášení
process.Start();