Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
16 / 9 / 1
Регистрация: 16.11.2021
Сообщений: 115
Записей в блоге: 3

Упражнения по теме делегаты и события

29.10.2022, 02:11. Показов 4113. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, какое-нибудь задание или задачу для практического понимания событий и делегатов.
Только что прошел теорию делегаты и события, все вроде и понятно, а вроде и нет.
Хочется что-нибудь сделать прикольное, для тренировки, а придумать ничего не получается.
Нашел в инете задание про пинг-понг, типа два класа шпуляют в друг друга сообщениями. Не понял причем тут события, если это делается одним методом.
И еще вот это вот сделал сам:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class ClassHandler
    {
        public delegate void dHand(int x);
        public event dHand EvenEv;
        public event dHand OddEv;
 
        public void Even_Odd_Method(int x)
        {
            if (x % 2 == 0)
            {
                EvenEv(x);
            }
            else
            {
                OddEv(x);
            }
 
 
        }
    }
    class ClassMessage
    {
        public string MesEven { get; set; }
        public string MesOdd { get; set; }
        public string MesOther { get; set; }
 
        public ClassMessage(string mesEven, string mesOdd, string mesOther)
        {
            MesEven = mesEven;
            MesOdd = mesOdd;
            MesOther = mesOther;
        }
 
 
        public void Even_method(int x)
        {
            Console.WriteLine($"{x} {MesEven}");
        }
 
        public void Odd_method(int x)
        {
            Console.WriteLine($"{x} {MesOdd}");
        }
    }
 
    class NumberGenerator
    {
        Random dice = new Random();
        int a;
 
        public int Count()
        {
            a = dice.Next(1, 1000);
            return a;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            NumberGenerator numbergenerator = new NumberGenerator();
            ClassHandler classHandler = new ClassHandler();
            ClassMessage classMessage = new ClassMessage("Это четное число", "Это нечетное число","");
 
            classHandler.EvenEv += classMessage.Even_method;
            classHandler.OddEv += classMessage.Odd_method;
 
            for (int x = 0;; x++)
            {
                classHandler.Even_Odd_Method(numbergenerator.Count());
                Thread.Sleep(500);             
            }
        }
    }


Но тема событий все равно не раскрыта.
Вроде как есть три класса (библиотеки).
В классе NumberGenerator может быть много всякой логики для генерации чисел.
ClassHandler может всячески сортировать эти числа по разным признакам.
ClassMessage сообщает о происходящем с числами пользователю. Причем текст сообщений, можно настраивать извне.

Но этот пример больше похож на больную фантазию.

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

Добавлено через 1 час 26 минут
Вот еще PingPong но тоже ощущение, что события применяются ради событий. Это можно было тоже обычными методами сделать
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
namespace PingPong
{
    public delegate void dPohg();
 
    class Pong
    {
        public event dPohg evPong;
 
        public void PongMethod()
        {
            Console.WriteLine("Ping received Pong.");
            Task.Delay(TimeSpan.FromSeconds(0.1)).Wait();
            evPong();
 
        }
    }
 
    class Ping
    {
        public event dPohg evPing;
 
        public void PingMethod()
        {
            Console.WriteLine("Pong received Ping.");
            Task.Delay(TimeSpan.FromSeconds(0.1)).Wait();
            evPing();
 
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Ping ping = new Ping();
            Pong pong = new Pong();
 
            ping.evPing += pong.PongMethod;
            pong.evPong += ping.PingMethod;
 
            ping.PingMethod();
        }
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.10.2022, 02:11
Ответы с готовыми решениями:

Упражнения по теме перегрузка операторов
Ищу упражнения для закрепление теории по теме перегрузка операторов по C#. Где можно взять данные упражнения?

Для чего использовать ключевое слово event в объявлении события, если события — это те же самые делегаты
Господа, скажите пожалуйста, для чего использовать ключевое слово event в объявлении события, если события - это те же самые делегаты ?...

События и делегаты
Привет комрадс! Можете объяснить, почему не срабатывает код? Изучаю события и делегаты, есть 2 класса: 1ый общается с пользователем и...

2
96 / 55 / 23
Регистрация: 01.05.2017
Сообщений: 78
29.10.2022, 08:46
Лучший ответ Сообщение было отмечено Leshakk как решение

Решение

События в C# это способ контролировать доступ к переменной-делегату, подобно свойствам для доступа к полям. Переменные-делегаты - по сути переменные в которых можно хранить несколько методов, подходящих под делегат-тип, и вызывать эти методы. В общем особой разницы между событиями и делегатами в C# я не вижу.

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Program
{    
    static void Main()
    {
        ArrayTransformation[] sorts = { Sort1, Sort2 };        
 
        for (int i = 0; i < sorts.Length; i++)
        {
            int[] A = { 3, 1, 5, 2 };
            sorts[i](A);
        }
    }
 
    delegate void ArrayTransformation(int[] array);
 
    static void Sort1(int[] A)
    {
        Console.WriteLine("Выполнение пузырьковой сортировки");
    }
    static void Sort2(int[] A)
    {
        Console.WriteLine("Выполнение сортировки вставками");
    }
}

Передача метода в другой метод

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Program
{    
    static void Main()
    {
        ArrayTransformation[] sorts = { Sort1, Sort2 };        
 
        for (int i = 0; i < sorts.Length; i++)
        {
            Console.WriteLine(TestSort(sorts[i]));
        }
    }
 
    static double TestSort(ArrayTransformation sort)
    {
        Stopwatch stopwatch = new Stopwatch();        
        int[] A = { 3, 1, 5, 2 };
        stopwatch.Start();
        sort(A);
        stopwatch.Stop();
        return stopwatch.Elapsed.TotalMilliseconds;
    }
 
    delegate void ArrayTransformation(int[] array);
 
    static void Sort1(int[] A)
    {
        Console.WriteLine("Выполнение пузырьковой сортировки");
    }
    static void Sort2(int[] A)
    {
        Console.WriteLine("Выполнение сортировки вставками");
    }
}



А события, как я писал ранее, это те же делегаты, только с методами add и remove. Но воспринимаем мы их иначе, сразу ожидая, что речь идет о применении как в шаблоне разработки (паттерне программирования) "наблюдатель".

Я думаю, лучше всего изучать события путем написания приложений Windows Forms. Там они очень активно используются. Начать с автоматического создания обработчиков событий (например когда делаем двойной щелчок по элементу управления в дизайнере формы или в списке событий на панели свойств). А потом дойти до программной генерации элементов управления на форме и назначения обработчиков для событий, связанных с ними.

Приложу файл с лабораторной работой на эту тему. Можно перенести её в Windows Forms, добавив программное создание кнопок и подписей к ним.


Ещё полезно пользоваться событиями в ситуациях, где требуется асинхронность, и в многопоточных приложениях.
Вложения
Тип файла: pdf ООП Лабораторная работа №1. Observer.pdf (105.0 Кб, 86 просмотров)
1
16 / 9 / 1
Регистрация: 16.11.2021
Сообщений: 115
Записей в блоге: 3
29.10.2022, 11:45  [ТС]
"Орки перед чтением статьи проверяют, упоминаются ли в тексте или заголовке эльфы, и если да, то отписываются от
издателя и пропускают эту статью."
Это чудо!!! Спасибо Вам огромное! Просто Шедевр! И главное доходит!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2022, 11:45
Помогаю со студенческими работами здесь

Делегаты и события
Я о них вроде как и прочел в нескольких источниках, но вникнуть в тему так и не смог. Можете порекомендовать источник, где был бы...

Делегаты и события
Создать класс Банк, с использование события ввода пин-кода(если неверный, повторить попытку) снятие и пополнение на счет. Добавлено...

События и делегаты
Не могу разобраться как объекту класса присвоить значение из тексбокса, чтобы при нажатии &quot;Подписаться на событие&quot; ...

Делегаты и события
Здравствуйте, подскажите пожалуйста как переделать этот код, чтобы выводило сообщение о событии на textBox. using System; using...

Делегаты и события
Всем доброго времени суток. Понадобилось код из C# переделать на C++. Кода в принципе не много и он не сложен в понимании. Но сам Я на C#...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru