Смысл событий C#
У меня есть пример использования события.
class ClassCounter
{
public delegate void MethodContainer();
public event MethodContainer onCount;
public void Count()
{
for (int i = 0; i < 100; i++)
{
if (i == 71)
{
onCount();
}
}
}
}
class Handler_I
{
public void Message()
{
Console.WriteLine("Пора действовать, ведь уже 71!");
}
}
class Program
{
[STAThread]
static void Main(string[] args)
{
ClassCounter Counter = new ClassCounter();
Handler_I Handler1 = new Handler_I();
Counter.onCount += Handler1.Message;
Counter.Count();
}
}
Но если убрать "event", то всё будет работать. Тогда в чём смысл event'а? Или по-другому: В чём различие использования события и просто делегата?
Ответы (4 шт):
Попробуйте это запустить с event и без event
class ClassCounter
{
public delegate void MethodContainer();
public MethodContainer onCount;
public void Count()
{
for (int i = 0; i < 100; i++)
{
if (i == 71)
{
onCount();
}
}
}
}
class Handler_I
{
public void Message()
{
Console.WriteLine("Пора действовать, ведь уже 71!");
}
public void Message1()
{
Console.WriteLine("Давай давай!");
}
public void Message2()
{
Console.WriteLine("Ну же!");
}
}
class Program
{
[STAThread]
static void Main(string[] args)
{
ClassCounter Counter = new ClassCounter();
Handler_I Handler1 = new Handler_I();
Counter.onCount += Handler1.Message;
Counter.onCount += Handler1.Message1;
Counter.onCount = Handler1.Message2;
Counter.Count();
}
}
У событий нельзя взять и всех подписчиков заменить на другого одной строкой. Зачем это нужно? Это всё ООП , вопрос для любителей пофилософствовать
я думаю, что когда мы используем слово event то тогда мы можем создать список методов, которые будут выполнятся при наступления этого события с помощью +=. Но если мы используем просто один делегат то тогда мы просто можем подписаться на один метод.
В документации написано так:
События представляют собой специальный вид многоадресного делегата, который можно вызвать только из класса или структуры, в которых он объявлен.
То есть событие не может быть инициировано откуда-то снаружи, и это хорошо для безопасности. Когда ты подписываешься на событие, то можешь быть уверен, что оно будет вызвано именно тем классом, на событие которого ты подписался, а не каким-то совершенно посторонним кодом.
События в C# - эдакая надстройка над делегатами. Если конкретнее - просто список делегатов (Delegate.Combine), к которому добавляются кое-какие изменения. Смысл событий в том, что они созданы для безопасного и удобного использования в контексте ООП. Значимые отличия событий от делегатов:
- Список событий можно редактировать только с помощью += и -=, или, если переопределить их, add и remove (похоже на get,set).
- Потокобезопасноть этих операторов (с большой оговоркой).
- Событие можно вызвать только из самого класса.
- Инкапсуляция (?)
- Удобство использования.