Sobes.tech
Junior

C# da voqealar nima?

sobes.tech AI

AIdan javob

C# da voqealar Observer Pattern asosida qurilgan mexanizmdir va ob'ekt (nashr qiluvchi) muayyan harakat yoki holat o'zgarishini boshqa ob'ektlarga (obuna bo'luvchilarga) xabar berishga imkon beradi.

Asosiy komponentlar:

  • Nashr qiluvchi (Publisher): Voqeani e'lon qiladigan sinf.
  • Voqea (Event): event kalit so'zi yordamida e'lon qilingan voqea. Bu handlerlar foydalanadigan metodning imzosini belgilaydi.
  • Delegat (Delegate): Voqeaga yozilish mumkin bo'lgan metodlarning imzosini belgilovchi tur. Ko'pincha EventHandler yoki EventHandler<TEventArgs> oldindan belgilangan delegat ishlatiladi.
  • Obuna bo'luvchi (Subscriber): Nashr qiluvchining voqeasiga yoziladigan va voqea yuzaga kelganda chaqiriladigan metod (voqea handler) ta'minlaydigan sinf yoki ob'ekt.
  • Voqea handler (Event Handler): Voqeaga yozilgan metod, voqea delegatining imzosiga mos keladi.

Misol uchun e'lon qilish va foydalanish:

// Oldindan belgilangan EventHandler ishlatilmayotgan bo'lsa delegatni e'lon qilish
public delegate void MyEventHandler(object sender, EventArgs e);

// Nashr qiluvchi sinf
public class Publisher
{
    // Delegat yordamida voqeani e'lon qilish
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Voqeani chaqirish (agar obuna bo'luvchilar bo'lsa)
        OnMyEvent(EventArgs.Empty);
    }

    // Voqeani chaqirish uchun metod (nulldan himoyalangan)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Obuna bo'luvchi sinf
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Voqeaga yozilish
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Voqeadan yozilishni bekor qilish
        publisher.MyEvent -= HandleMyEvent;
    }

    // Voqea handler
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Voqea yuz berdi!");
    }
}

// Foydalanish misoli
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Yozilish

        pub.DoSomething(); // Voqeani chaqirish

        sub.Unsubscribe(pub); // Yozilishni bekor qilish (ixtiyoriy)
    }
}

Voqealar ob'ektlar o'rtasida bo'sh bog'lanishni (loose coupling) ta'minlaydi, ular bir-birining implementatsiyasini bilmasdan o'zaro ta'sir qilishlariga imkon beradi.