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); // Чыгуу (кызматтык)
    }
}

Окуялар объекттердин алсыз байланышын камсыздайт, бул алардын бири-бири менен өз ара аракеттенүүсүнө мүмкүндүк берет, түздөн-түз бири-биринин ишке ашырылышы жөнүндө билишпестен.