В общем, я хочу знать, какой эффект от ключевого слова event стоит за действием и в чем разница между ним и действием без события и какую функцию оно добавляет?
Намекать: Пожалуйста, ответьте на этот вопрос так, потому что я не нашел именно этого.
public event Action action; // event action
public Action action; // action
Одно событие, а другое нет. Если вы понимаете события и делегаты, вы понимаете, что это значит. Если вы не понимаете, что это значит, вы не понимаете событий и делегатов, поэтому вам нужно исследовать это. В этом-то и дело. Вы утверждаете, что не спрашиваете о чем-то, что нам пришлось бы объяснять, чтобы ответить на ваш вопрос в деталях, поэтому вы спрашиваете об этом. Ваш вопрос слишком широк.
Посмотрите на это, чтобы увидеть, что компилятор делает из события: Sharlab.io/…
@SomeBody Спасибо, это было очень полезно. По крайней мере, показали, что два ключевых слова добавить и удалить в событии можно настроить.
См. csharpindepth.com/Статьи/События





Когда вы объявляете public Action action;, у вас есть публичный делегат. Его можно переназначить куда угодно, что может быть опасно. Когда вы объявляете public event Action action;, у вас есть класс со скрытым полем делегата, и класс предоставляет только некоторые функции делегатов; в частности, вы можете присоединять и отсоединять методы только с помощью += и -=, но не напрямую переназначать с помощью =. Чтобы пояснить, что это значит: предположим, у вас есть следующий код:
using System;
class Worker
{
public Action action;
public void DoWork() {
action();
}
}
static class Test
{
public static void Foo() {
Console.WriteLine("Foo!");
}
public static void Main() {
Worker w = new Worker();
w.action = Foo;
w.DoWork();
}
}
У класса Worker есть открытый делегат с именем action. В Main мы создаем новый экземпляр w и делаем так, чтобы его action указывал на метод Foo. Позже мы можем переназначить его, сказав что-то вроде w.action = Bar. Это может рассматриваться как опасное.
Если бы поле action класса Worker было определено как event, то есть public event Action action;, то прямое присвоение, такое как w.action = Foo, было бы недопустимым. Вместо этого мы можем прикреплять определенного обработчика события, используя +=. Затем работает следующее:
using System;
class Worker
{
public event Action action;
public void DoWork() {
action();
}
}
static class Test
{
public static void Foo() {
Console.WriteLine("Foo!");
}
public static void Main() {
Worker w = new Worker();
w.action += Foo;
w.DoWork();
}
}
Это был хороший пример и ответ, который я искал, так что большое спасибо. К сожалению, большинство моих проблем с программированием связано с моим неакадемическим образованием.
Вот ссылка на некоторую документацию, которая даст вам информацию, которую вы ищете: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…