Sobes.tech
Junior — Middle

Kaip atskirti delegatą nuo įvykio ir kokie yra jų pagrindiniai skirtumai?

sobes.tech AI

Atsakymas iš AI

C# kalba delegatas yra tipas, kuris atstovauja nuorodą į metodą su tam tikru parašu. Delegatai leidžia išvesti metodus netiesiogiai, perduodant juos kaip parametrus arba juos saugant vėlesniam iškvietimui.

Įvykis yra mechanizmas, pagrįstas delegatais, kuris naudojamas pranešti prenumeratoriams apie tam tikro veiksmo ar būsenos pasikeitimą. Įvykis inkapsuliuoja delegatą ir riboja prieigą prie jo: prenumeratoriai gali tik pridėti arba pašalinti tvarkytojus, bet negali tiesiogiai iškviesti įvykio.

Pagrindiniai skirtumai:

  • Delegatas yra tipas, įvykis yra klasės narys, kuris naudoja delegatą.
  • Delegatą galima iškviesti tiesiogiai, įvykį — ne (įvykio iškvietimas galimas tik klasės viduje, kurioje jis deklaruotas).
  • Įvykis užtikrina inkapsuliaciją ir saugumą, užkertant kelią atsitiktiniam iškvietimui iš išorės.

Pavyzdys:

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

public class Process
{
    public event Notify ProcessCompleted; // įvykis

    public void Start()
    {
        // ... proceso vykdymas
        OnProcessCompleted("Procesas baigtas");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // įvykio iškvietimas
    }
}

// Naudojimas:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // prenumerata
process.Start();