События С#

Привет, я расскажу вам об одной функции, которую я люблю в C#. Его зовут Событие. Итак, что за событие?

События

Проще говоря, события выполняют работу вашего класса с другими классами. Полагаю, мне будет проще объяснить с помощью примера.

Перед примером я покажу, где вы используете события, не зная об этом. У вас есть приложение-форма, необходимо показывать окно сообщения при нажатии на кнопку. Для этого, вероятно, вы создали метод с двойным щелчком по кнопке, и это фактически событие.

Если вы изучите файл Designer.cs, вы увидите метод, который начинается с оператора +=. Я дал вам образец RichTextBox в файле down.

Теперь мы можем перейти к выборке. Вы пишете класс, целью этого класса является сбор чисел. Когда вы собираете числа, вы должны показывать графический интерфейс, который предоставляет информацию пользователю. Вероятно, вы делали это, обращаясь к вашему классу формы из класса процесса до сих пор. Другой пример:

//Math.cs
class Math{
    public void Collect(int n1, int n2){
        int number = n1 + n2;
        MainForm.form.lblState.Text = number.ToString();
    }
}
//MainForm.cs
partial class MainForm : Form{
    public static MainForm form;
    public MainForm(){
        InitializeComponent();
        form = this;
    }
}

Но есть ситуация, что вы делаете, когда хотите использовать этот класс в другом классе или проекте? Вы можете подумать о том, чтобы преобразовать этот метод в целочисленный метод, и вы правы, это проще, чем событие.

Я приведу другой пример, у вас есть асинхронный метод. Таким образом, вы не можете знать, когда этот метод возвращает значение. Это может быть, когда вы используете протокол TCP. Вы не можете знать время доставки сообщения. Смешно проверять это циклом. Я думаю, ты понял.

Тип делегата

Это друг актерских методов. Вы можете привязать метод к переменной с действием. Я хочу начать с его видов. Существует два типа: действие и функция. Действие, не возвращает значение; Функция, возвращает значение. Оба они могут принимать максимум 16 параметров. Вы можете вызывать свои методы, вызывая Invoke().

static void Collect(int a, int b){
    Console.WriteLine(a + b);
}
static void Main(string[] args){
    Action<int, int> collect = new Action<int, int>(Collect); // <>                                            contains types.
    collect.Invoke(20, 30); // We run our method.
    // or
    collect(20, 30); 
}
static int Collect(double a, double b){
    return (int)(a + b);
}
static void Main(string[] args){
    Func<double, double, int> collect = new Func<double, double, int>(Toplat); // First is out, another are input parameters.
    Console.WriteLine(collect.Invoke(10.5, 13.5));
    // Output 24
}

Вы можете создать своего собственного делегата.

public delegate string MyDelegate(string d1, string d2);
// We created our delegate like creating a method.
static void Main(string[] args){
    MyDelegate myd = new MyDelegate((d1, d2) => d1 + " " + d2); // We concat two strings with the one line method.
    Console.WriteLine(myd("abc", "cba"));
}

Однострочные методы

Прежде чем использовать события, вы должны их знать. Если вы этого не знаете, каждый раз, когда вы хотите сделать процесс, вы будете создавать метод отдельно, и это сделает ваш код грязным. Вы можете использовать эти методы везде.

Как правило, их синтаксис похож на лямбда-функции.
(params) => process

static void Main(string[] args){
    Action method = () => Console.WriteLine("Hello World!"); // Function without parameter.
    Action<string> method2 = (a) => Console.WriteLine(a); // Function with parameter.
  
    method();
    method2("Test");
  
    Func<int> method3 = () => 30; // Function that returns 30.
    method2.Invoke(method3().ToString());
}

Мы можем перейти к событиям.

Общий синтаксис

Чтобы использовать события, нам нужен делегат. Мы посещаем этого делегата на нашем мероприятии. Вы не можете использовать события в статическом классе или функции, не забывайте об этом.

public class Program{
    static void Main(string[] args){
        MyClass s = new MyClass();
        s.MyEvent += (total) => Console.WriteLine(total);
        s.Collect(30, 40);
      
        //Output 70
    }
}
public class MyClass{
    public event Action<int> MyEvent;
    public void Collect(int a, int b){
        int total = a + b;
        MyEvent?.Invoke(total);
        // ? operator means you don't run when MyEvent is null.
    }
}

Вы можете добавить несколько методов к одному событию.

Используя фигурные скобки, вы можете таким образом написать многострочную функцию.

Итак, теперь вы знаете, как использовать события.