0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<ul><li><a>Термины - базовые понятия</a></li>
1
<ul><li><a>Термины - базовые понятия</a></li>
2
<li><a>Событие - это…</a><ul><li><a>О типах и их возможностях</a></li>
2
<li><a>Событие - это…</a><ul><li><a>О типах и их возможностях</a></li>
3
</ul></li>
3
</ul></li>
4
<li><a>Делегаты</a></li>
4
<li><a>Делегаты</a></li>
5
<li><a>События - ключевые моменты</a><ul><li><a>Определение и вызов</a></li>
5
<li><a>События - ключевые моменты</a><ul><li><a>Определение и вызов</a></li>
6
<li><a>Как добавить обработчик</a></li>
6
<li><a>Как добавить обработчик</a></li>
7
<li><a>Удаление</a></li>
7
<li><a>Удаление</a></li>
8
<li><a>Управление</a></li>
8
<li><a>Управление</a></li>
9
</ul></li>
9
</ul></li>
10
<li><a>Как быть с C++</a><ul><li><a>Класс Delegate</a></li>
10
<li><a>Как быть с C++</a><ul><li><a>Класс Delegate</a></li>
11
<li><a>Класс Event</a></li>
11
<li><a>Класс Event</a></li>
12
</ul></li>
12
</ul></li>
13
</ul><p>Для того, чтобы программировать, нужно знать определенные языки и их особенности. Важную роль здесь играют не только объекты и функции, но и так называемые события.</p>
13
</ul><p>Для того, чтобы программировать, нужно знать определенные языки и их особенности. Важную роль здесь играют не только объекты и функции, но и так называемые события.</p>
14
<p>В данной статье речь зайдет о том, что такое event. Примеры будут разобраны на языках СИ-семейства - C# и C++. Это одни из самых перспективных ЯП в сфере объектно-ориентированного программирования.</p>
14
<p>В данной статье речь зайдет о том, что такое event. Примеры будут разобраны на языках СИ-семейства - C# и C++. Это одни из самых перспективных ЯП в сфере объектно-ориентированного программирования.</p>
15
<h2>Термины - базовые понятия</h2>
15
<h2>Термины - базовые понятия</h2>
16
<p>Перед тем, как с помощью предложенных языков писать программы и использовать обработчик событий, необходимо сначала научиться базовым приемам создания софта. А еще - запомнить несколько ключевых терминов.</p>
16
<p>Перед тем, как с помощью предложенных языков писать программы и использовать обработчик событий, необходимо сначала научиться базовым приемам создания софта. А еще - запомнить несколько ключевых терминов.</p>
17
<p>Каждый разработчик должен помнить следующие определения:</p>
17
<p>Каждый разработчик должен помнить следующие определения:</p>
18
<ol><li>Алгоритм - набор операций и инструкций, а также указаний, с помощью которого удается решать поставленные изначально задачи.</li>
18
<ol><li>Алгоритм - набор операций и инструкций, а также указаний, с помощью которого удается решать поставленные изначально задачи.</li>
19
<li>API - интерфейс прикладного программирования. Представлен правилами и инструкциями, помогающими создавать утилиты.</li>
19
<li>API - интерфейс прикладного программирования. Представлен правилами и инструкциями, помогающими создавать утилиты.</li>
20
<li>Аргументы - значения, передаваемые в команды и функции.</li>
20
<li>Аргументы - значения, передаваемые в команды и функции.</li>
21
<li>Оператор - то, что манипулирует компонентами кода через операнды.</li>
21
<li>Оператор - то, что манипулирует компонентами кода через операнды.</li>
22
<li>Операнд - объект, которым можно управлять через операторы.</li>
22
<li>Операнд - объект, которым можно управлять через операторы.</li>
23
<li>Переменная - именованная ячейка памяти, которая зарезервирована системой. Хранилище данных в программе.</li>
23
<li>Переменная - именованная ячейка памяти, которая зарезервирована системой. Хранилище данных в программе.</li>
24
<li>Объект - связанные между собой переменные, структурные единицы и константы, которые выбираются совместно, а также обрабатываются.</li>
24
<li>Объект - связанные между собой переменные, структурные единицы и константы, которые выбираются совместно, а также обрабатываются.</li>
25
<li>Класс - набор связанных объектов. У них должны быть общие свойства.</li>
25
<li>Класс - набор связанных объектов. У них должны быть общие свойства.</li>
26
<li>Тип данных - классификация электронных материалов определенного вида.</li>
26
<li>Тип данных - классификация электронных материалов определенного вида.</li>
27
<li>Массив - множество информации. Списки и группы схожих типов данных, которые предварительно проходят стадию группировки.</li>
27
<li>Массив - множество информации. Списки и группы схожих типов данных, которые предварительно проходят стадию группировки.</li>
28
<li>Итерация - один проход через заданный набор операций в коде.</li>
28
<li>Итерация - один проход через заданный набор операций в коде.</li>
29
<li>Ключевое слово - зарезервированное синтаксисом ЯП слово. Помогает обозначать операции и функции. Ключевое слово не может выступать в качестве имени класса, переменной или иного компонента.</li>
29
<li>Ключевое слово - зарезервированное синтаксисом ЯП слово. Помогает обозначать операции и функции. Ключевое слово не может выступать в качестве имени класса, переменной или иного компонента.</li>
30
<li>Указатели - переменные, содержащие адреса мест в памяти.</li>
30
<li>Указатели - переменные, содержащие адреса мест в памяти.</li>
31
</ol><p>Также стоит обратить внимание на раскрытие понятия "метод". Это в объектно-ориентированном программировании - функция/процедура, которая относится к тому или иному классу, объекту. Включает в себя операторы и входные аргументы.</p>
31
</ol><p>Также стоит обратить внимание на раскрытие понятия "метод". Это в объектно-ориентированном программировании - функция/процедура, которая относится к тому или иному классу, объекту. Включает в себя операторы и входные аргументы.</p>
32
<h2>Событие - это…</h2>
32
<h2>Событие - это…</h2>
33
<p>Событие - член типа при помощи которого соответствующий тип или его экземпляр могут уведомлять иные объекты о наступлении особых ситуаций. Пример - возникновение ошибок или сбоев в системе, клик по кнопке.</p>
33
<p>Событие - член типа при помощи которого соответствующий тип или его экземпляр могут уведомлять иные объекты о наступлении особых ситуаций. Пример - возникновение ошибок или сбоев в системе, клик по кнопке.</p>
34
<p>Другие объекты в написанном коде при получении сообщения о событии могут давать "обратный ответ". А именно - выполнять те или иные действия. Под событием принято понимать член типа, отвечающий за обеспечение соответствующего взаимодействия компонентов в коде.</p>
34
<p>Другие объекты в написанном коде при получении сообщения о событии могут давать "обратный ответ". А именно - выполнять те или иные действия. Под событием принято понимать член типа, отвечающий за обеспечение соответствующего взаимодействия компонентов в коде.</p>
35
<p>Событие:</p>
35
<p>Событие:</p>
36
<ul><li>сообщение, возникающее в различных точках исходного кода при выполнении заданных условий;</li>
36
<ul><li>сообщение, возникающее в различных точках исходного кода при выполнении заданных условий;</li>
37
<li>переход объекта или класса из одного состояния в другое;</li>
37
<li>переход объекта или класса из одного состояния в другое;</li>
38
<li>абстракция инцидента или сигнала в реальном мире, который сигнализирует о перемещении чего-либо в новое состояние.</li>
38
<li>абстракция инцидента или сигнала в реальном мире, который сигнализирует о перемещении чего-либо в новое состояние.</li>
39
</ul><p>Отдельное внимание стоит уделить типу, в котором прописано то или иное событие. Оно должно удовлетворять некоторым "условиям".</p>
39
</ul><p>Отдельное внимание стоит уделить типу, в котором прописано то или иное событие. Оно должно удовлетворять некоторым "условиям".</p>
40
<h3>О типах и их возможностях</h3>
40
<h3>О типах и их возможностях</h3>
41
<p>Тип, в котором было определено событие, позволяет:</p>
41
<p>Тип, в котором было определено событие, позволяет:</p>
42
<ol><li>Производить регистрацию обработчика событий. К ним относят статические или экземплярные методы, которые заинтересованы в получении уведомления о событии. Выполняют в ответ на event конкретные операции.</li>
42
<ol><li>Производить регистрацию обработчика событий. К ним относят статические или экземплярные методы, которые заинтересованы в получении уведомления о событии. Выполняют в ответ на event конкретные операции.</li>
43
<li>Отменять регистрацию компонента под названием "обработчик событий".</li>
43
<li>Отменять регистрацию компонента под названием "обработчик событий".</li>
44
<li>Уведомлять обработчик (если их несколько - все) о том, что операция произошла.</li>
44
<li>Уведомлять обработчик (если их несколько - все) о том, что операция произошла.</li>
45
</ol><p>Стоит обратить внимание на то, что в C++ нет событий. При необходимости разработчику предстоит создать соответствующие "компоненты" на библиотечном уровне. Чуть позже будет рассмотрен один такой вариант, который предусматривает несколько классов. К ним относят Delegate и Event.</p>
45
</ol><p>Стоит обратить внимание на то, что в C++ нет событий. При необходимости разработчику предстоит создать соответствующие "компоненты" на библиотечном уровне. Чуть позже будет рассмотрен один такой вариант, который предусматривает несколько классов. К ним относят Delegate и Event.</p>
46
<h2>Делегаты</h2>
46
<h2>Делегаты</h2>
47
<p>Модель event в C# базируется на делегатах. Аналогичным образом ситуация обстоит с .NET. Делегат - это тип, который содержит ссылку на метод. Он:</p>
47
<p>Модель event в C# базируется на делегатах. Аналогичным образом ситуация обстоит с .NET. Делегат - это тип, который содержит ссылку на метод. Он:</p>
48
<ul><li>объявляется при помощи сигнатуры, указывающий тип возвращаемого значения и параметры для методов, на которые происходит ссылка;</li>
48
<ul><li>объявляется при помощи сигнатуры, указывающий тип возвращаемого значения и параметры для методов, на которые происходит ссылка;</li>
49
<li>способен включать в себя лишь ссылки на методы, соответствующие сигнатуре;</li>
49
<li>способен включать в себя лишь ссылки на методы, соответствующие сигнатуре;</li>
50
<li>эквивалентен указателю на строго типизированные функции или обратные вызовы.</li>
50
<li>эквивалентен указателю на строго типизированные функции или обратные вызовы.</li>
51
</ul><p>Для того, чтобы объявить делегат, достаточно определить его класс. В .NET соответствующий компонент имеет широкую область применения, как и в C#.</p>
51
</ul><p>Для того, чтобы объявить делегат, достаточно определить его класс. В .NET соответствующий компонент имеет широкую область применения, как и в C#.</p>
52
<p>Вот пример объявления делегата в C#:</p>
52
<p>Вот пример объявления делегата в C#:</p>
53
<p>Public delegate void ThresholdReachedEventHander(object sender, ThresholdReachedEventArgs e);</p>
53
<p>Public delegate void ThresholdReachedEventHander(object sender, ThresholdReachedEventArgs e);</p>
54
<p>Стоит обратить внимание на то, что сценарии, для которых требуется определять собственные делегаты, встречаются на практике крайне редко. Пример - когда ведется работа с кодом, не умеющим распознавать универсальные типы.</p>
54
<p>Стоит обратить внимание на то, что сценарии, для которых требуется определять собственные делегаты, встречаются на практике крайне редко. Пример - когда ведется работа с кодом, не умеющим распознавать универсальные типы.</p>
55
<h2>События - ключевые моменты</h2>
55
<h2>События - ключевые моменты</h2>
56
<p>Стоит обратить внимание на то, как правильно осуществлять работу с events. Далее будет представлена информация, помогающая обрабатывать "сообщения системы", объявлять их и корректировать при необходимости.</p>
56
<p>Стоит обратить внимание на то, как правильно осуществлять работу с events. Далее будет представлена информация, помогающая обрабатывать "сообщения системы", объявлять их и корректировать при необходимости.</p>
57
<h3>Определение и вызов</h3>
57
<h3>Определение и вызов</h3>
58
<p>События в классе будут объявляться при помощи ключевого слова - event. После него требуется указать тип делегата, который представляет "происшествие".</p>
58
<p>События в классе будут объявляться при помощи ключевого слова - event. После него требуется указать тип делегата, который представляет "происшествие".</p>
59
<p>Здесь:</p>
59
<p>Здесь:</p>
60
<ol><li>Есть public class.</li>
60
<ol><li>Есть public class.</li>
61
<li>В самом начале осуществляется определение делегата AccountHandler. Он будет принимать один параметр вида string.</li>
61
<li>В самом начале осуществляется определение делегата AccountHandler. Он будет принимать один параметр вида string.</li>
62
<li>При помощи ключевого слова происходит создание некоторого event с именем Notify. Оно представляет delegate.</li>
62
<li>При помощи ключевого слова происходит создание некоторого event с именем Notify. Оно представляет delegate.</li>
63
<li>Название события может выступать в качестве произвольного. Оно обязательно представляет тот или иной делегат.</li>
63
<li>Название события может выступать в качестве произвольного. Оно обязательно представляет тот или иной делегат.</li>
64
</ol><p>После того, как событие оказалось определено, можно его вызвать как метод. Для этого необходимо использовать имя события. Чтобы избежать ошибок в момент, когда осуществляется обработка "сообщения", стоит проверять его на null:</p>
64
</ol><p>После того, как событие оказалось определено, можно его вызвать как метод. Для этого необходимо использовать имя события. Чтобы избежать ошибок в момент, когда осуществляется обработка "сообщения", стоит проверять его на null:</p>
65
<p>Можно вызвать event через метод Invoke(). Для этого предстоит передать в него желаемые значения для параметров.</p>
65
<p>Можно вызвать event через метод Invoke(). Для этого предстоит передать в него желаемые значения для параметров.</p>
66
<p>А вот программа, которая послужит примером реализации рассмотренных операций:</p>
66
<p>А вот программа, которая послужит примером реализации рассмотренных операций:</p>
67
class Account { public delegate void AccountHandler(string message); public event AccountHandler? Notify; // 1.Определение события public Account(int sum) => Sum = sum; public int Sum { get; private set; } public void Put(int sum) { Sum += sum; Notify?.Invoke($"На счет поступило: {sum}"); // 2.Вызов события } public void Take(int sum) { if (Sum >= sum) { Sum -= sum; Notify?.Invoke($"Со счета снято: {sum}"); // 2.Вызов события } else { Notify?.Invoke($"Недостаточно денег на счете. Текущий баланс: {Sum}"); ; } } }<p>Система здесь получит уведомление о том, что средства добавлены/сняты со счета. Также система выдаст сообщение, если на балансе недостаточно денег.</p>
67
class Account { public delegate void AccountHandler(string message); public event AccountHandler? Notify; // 1.Определение события public Account(int sum) => Sum = sum; public int Sum { get; private set; } public void Put(int sum) { Sum += sum; Notify?.Invoke($"На счет поступило: {sum}"); // 2.Вызов события } public void Take(int sum) { if (Sum >= sum) { Sum -= sum; Notify?.Invoke($"Со счета снято: {sum}"); // 2.Вызов события } else { Notify?.Invoke($"Недостаточно денег на счете. Текущий баланс: {Sum}"); ; } } }<p>Система здесь получит уведомление о том, что средства добавлены/сняты со счета. Также система выдаст сообщение, если на балансе недостаточно денег.</p>
68
<h3>Как добавить обработчик</h3>
68
<h3>Как добавить обработчик</h3>
69
<p>В программировании можно добавлять один или несколько обработчиков. Это - то, что будет выполняться при вызове "происшествия". Часто это не классы, а методы. Каждый обработчик событий по списку заданных параметров и возвращаемому типу будет соответствовать делегату, которые представляет событие. Для того, чтобы добавить обработчик, нужно применить операцию "+=".</p>
69
<p>В программировании можно добавлять один или несколько обработчиков. Это - то, что будет выполняться при вызове "происшествия". Часто это не классы, а методы. Каждый обработчик событий по списку заданных параметров и возвращаемому типу будет соответствовать делегату, которые представляет событие. Для того, чтобы добавить обработчик, нужно применить операцию "+=".</p>
70
<p>Здесь:</p>
70
<p>Здесь:</p>
71
<ol><li>Используется метод DisplayMessage. Он соответствует delegate AccountHandler.</li>
71
<ol><li>Используется метод DisplayMessage. Он соответствует delegate AccountHandler.</li>
72
<li>При вызове данных события будет обрабатываться соответствующий метод. Для параметра message передается строчка, встречающаяся в event.</li>
72
<li>При вызове данных события будет обрабатываться соответствующий метод. Для параметра message передается строчка, встречающаяся в event.</li>
73
<li>В DisplayMessage осуществляется вывод полученного сообщения. При желании можно определить здесь совершенно любую логику.</li>
73
<li>В DisplayMessage осуществляется вывод полученного сообщения. При желании можно определить здесь совершенно любую логику.</li>
74
</ol><p>После этого можно выделить самостоятельный класс Account в качестве библиотеки классов. После - использовать в своих проектах.</p>
74
</ol><p>После этого можно выделить самостоятельный класс Account в качестве библиотеки классов. После - использовать в своих проектах.</p>
75
<h3>Удаление</h3>
75
<h3>Удаление</h3>
76
<p>В любой момент программист может провести создание или удаление обработчиков. Для удаления необходимо использовать операцию "-=".</p>
76
<p>В любой момент программист может провести создание или удаление обработчиков. Для удаления необходимо использовать операцию "-=".</p>
77
<p>Выше - то, как будет выглядеть соответствующий код.</p>
77
<p>Выше - то, как будет выглядеть соответствующий код.</p>
78
<h3>Управление</h3>
78
<h3>Управление</h3>
79
<p>Обработка events при помощи аксессоров может управляться разработчиком. Для этого используется add или remove. Такая функциональность встречается на практике редко.<a>Здесь</a>можно увидеть, как происходит удаление и добавление обработчика подобным образом.</p>
79
<p>Обработка events при помощи аксессоров может управляться разработчиком. Для этого используется add или remove. Такая функциональность встречается на практике редко.<a>Здесь</a>можно увидеть, как происходит удаление и добавление обработчика подобным образом.</p>
80
<p>Можно также передавать некоторые данные об events. Пример - добавление в программы, указанные выше, new класс AccountEventArgs. Он будет содержать такой код:</p>
80
<p>Можно также передавать некоторые данные об events. Пример - добавление в программы, указанные выше, new класс AccountEventArgs. Он будет содержать такой код:</p>
81
<p>Этот класс обладает двумя свойствами:</p>
81
<p>Этот класс обладает двумя свойствами:</p>
82
<ul><li>Message - хранение выводимого сообщения;</li>
82
<ul><li>Message - хранение выводимого сообщения;</li>
83
<li>Sum - содержит сумму, на которую изменился баланс.</li>
83
<li>Sum - содержит сумму, на которую изменился баланс.</li>
84
</ul><p>Теперь можно применить класс AccountEventArgs, откорректировав класс Account:</p>
84
</ul><p>Теперь можно применить класс AccountEventArgs, откорректировав класс Account:</p>
85
<p>Основная программа должна выглядеть так:</p>
85
<p>Основная программа должна выглядеть так:</p>
86
<p>Обработка events в C++ - это более сложное понятие. Связано это с тем, что обработчиков у этого языка программирования нет. Предстоит работать с различными классами. Пример - Delegate и Event.</p>
86
<p>Обработка events в C++ - это более сложное понятие. Связано это с тем, что обработчиков у этого языка программирования нет. Предстоит работать с различными классами. Пример - Delegate и Event.</p>
87
<h3>Класс Delegate</h3>
87
<h3>Класс Delegate</h3>
88
<p>Этот класс будет расширять понятие указателя на функцию. С его помощью удается передавать ссылки на методы объектам-делегатам. Далее последний может быть передан клиентскому коду, который косвенно вызывает метод.</p>
88
<p>Этот класс будет расширять понятие указателя на функцию. С его помощью удается передавать ссылки на методы объектам-делегатам. Далее последний может быть передан клиентскому коду, который косвенно вызывает метод.</p>
89
<p>Класс Delegate дает существенное преимущество - ему можно передавать динамически указатели на методы и изменять поведение приложения. Перекомпиляция здесь не нужна. Софт будет оставаться в неведении о манипуляциях.</p>
89
<p>Класс Delegate дает существенное преимущество - ему можно передавать динамически указатели на методы и изменять поведение приложения. Перекомпиляция здесь не нужна. Софт будет оставаться в неведении о манипуляциях.</p>
90
<p>Выше - пример использования класса Delegate.</p>
90
<p>Выше - пример использования класса Delegate.</p>
91
<h3>Класс Event</h3>
91
<h3>Класс Event</h3>
92
<p>Событие - способ для класса относительно оповещения клиентов о том, что что-то произошло. Можно использовать Event в C++ для реализации рассматриваемого "компонента".</p>
92
<p>Событие - способ для класса относительно оповещения клиентов о том, что что-то произошло. Можно использовать Event в C++ для реализации рассматриваемого "компонента".</p>
93
<p>В данном случае сторонний объект будет помещать указатель на свой метод в делегат. После - передавать последний событию. При срабатывании события осуществляется вызов делегата. Как следствие - метода, который ему был передан.</p>
93
<p>В данном случае сторонний объект будет помещать указатель на свой метод в делегат. После - передавать последний событию. При срабатывании события осуществляется вызов делегата. Как следствие - метода, который ему был передан.</p>
94
<p>Выше - пример использования класса Event в C++ для обработки событий. А<a>вот</a>- видео-урок по рассмотренной теме в C#. Чтобы надписи типа static void, eventargs e, delegate и другие не вызывали трудности, стоит закончить специализированные дистанционные компьютерные курсы. В течение года с нуля пользователя там научат писать коды на выбранных языках. Есть как предложения для новичков, так и для опытных разработчиков.</p>
94
<p>Выше - пример использования класса Event в C++ для обработки событий. А<a>вот</a>- видео-урок по рассмотренной теме в C#. Чтобы надписи типа static void, eventargs e, delegate и другие не вызывали трудности, стоит закончить специализированные дистанционные компьютерные курсы. В течение года с нуля пользователя там научат писать коды на выбранных языках. Есть как предложения для новичков, так и для опытных разработчиков.</p>
95
<a></a><a></a>
95
<a></a><a></a>