HTML Diff
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) =&gt; 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 &gt;= 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) =&gt; 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 &gt;= 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>