Sobes.tech
Junior — Middle

Чӣ гуна фарқ кардани намоянда ва ҳодиса ва чӣ фарқиятҳои асосӣ доранд?

sobes.tech AI

Ҷавоб аз AI

В C# делегат е тип, който представлява препратка към метод с определена сигнатура. Делегатите позволяват косвено извикване на методи, като ги предават като параметри или ги съхраняват за последващ извик.

Събитие е механизъм, базиран на делегати, който се използва за уведомяване на абонатите за настъпването на дадено действие или промяна в състоянието. Събитието инкапсулира делегата и ограничава достъпа до него: абонатите могат само да добавят или премахват обработчици, но не могат да извикат събитието директно.

Основни разлики:

  • Делегатът е тип, събитието е член на клас, който използва делегат.
  • Делегатът може да бъде извикан директно, събитието не (извикването на събитието е възможно само в рамките на класа, където е обявено).
  • Събитието осигурява инкапсулация и сигурност, предотвратявайки произволни извиквания отвън.

Пример:

public delegate void Notify(string message); // делегат

public class Process
{
    public event Notify ProcessCompleted; // събитие

    public void Start()
    {
        // ... изпълнение на процеса
        OnProcessCompleted("Процесът е завършен");
    }

    protected virtual void OnProcessCompleted(string msg)
    {
        ProcessCompleted?.Invoke(msg); // извикване на събитието
    }
}

// Използване:
var process = new Process();
process.ProcessCompleted += msg => Console.WriteLine(msg); // абонамент
process.Start();