Sobes.tech
Junior

რა არის მოვლენები C#-ში?

sobes.tech AI

პასუხი AI-სგან

C#-та вакыйгалар — бу ул "наблюдатель" (Observer Pattern) шаблонына нигезләнгән механизм, ул объектка (чыгаручыга) башка объектларны (язылучыларны) билгеле берелгән эш яки хәленең үзгәрүе турында хәбәр итәргә мөмкинлек бирә.

Төп компонентлар:

  • Язылучы (Publisher): Вакыйганы игълан итә торган класс.
  • Вакыйга (Event): event ачкыч сүзе белән игълан ителә. Ул эшкәртүче методның сигнатурасын билгели.
  • Делегат (Delegate): Вакыйгага язылырга мөмкин булган методларның сигнатурасын билгели торган тип. Күп вакытта алдан билгеләнгән EventHandler яки EventHandler<TEventArgs> кулланыла.
  • Язылучы (Subscriber): Язылучы класс яки объект, ул чыгарыучы вакыйгасына язылып, вакыйга килеп чыкканда чакырылучы эшкәртүче методны тәэмин итә.
  • Вакыйга эшкәртүче (Event Handler): Язылучының методы, ул вакыйга делегатының сигнатурасына туры килә.

Мисал игълан итү һәм куллану:

// Делегат игълан итү, әгәр алдан билгеләнгән `EventHandler` кулланылмаса
public delegate void MyEventHandler(object sender, EventArgs e);

// Чыгарыучы класс
public class Publisher
{
    // Делегат кулланып вакыйганы игълан итү
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Вакыйганы чакыру (әгәр язылучылар бар икән)
        OnMyEvent(EventArgs.Empty);
    }

    // Вакыйганы чакыручы метод (nullдан сакланган)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Язылучы класс
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Вакыйгага язылу
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Вакыйгадан чыгуу
        publisher.MyEvent -= HandleMyEvent;
    }

    // Вакыйга эшкәртүче
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Вакыйга эшләде!");
    }
}

// Куллану мисалы
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Язылу

        pub.DoSomething(); // Вакыйганы чакыру

        sub.Unsubscribe(pub); // Чыгып китү (өстәмә)
    }
}

Вакыйгалар объектлар арасында зәгыйфь бәйләнеш (loose coupling) тәэмин итә, бу аларга бер-берсе белән турыдан-туры белешмәгә мохтаҗ булмыйча хезмәттәшлек итәргә мөмкинлек бирә.