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();