Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
38 / 38 / 52
Регистрация: 03.02.2016
Сообщений: 99

Делегаты и события

12.03.2016, 15:20. Показов 1286. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток уважаемые, очень туго идет освоение delegate and event, создал небольшую программку, с таким заданием: (Разработал класс (NewsOperator), который предоставляет услуги рассылки информации по категориям (News, Sports,Weather). Создал класс (Subscriber(подписчик)), который подписывается на определенную
категорию и при выходе новой новости в категории, подписчик получает услугу.

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

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

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
 delegate void MyEveentHandler();
    class NewsOperator
    {
        public event MyEveentHandler NewsNews;
        public event MyEveentHandler NewsSports;
        public event MyEveentHandler NewsWeather;
        public void News()
        {
            if (NewsNews != null)
                NewsNews();
            Console.WriteLine("This is news");
        }
        public void Sports()
        {
            if (NewsSports != null)
                NewsSports();
            Console.WriteLine("This is news sports");
        }
        public void Weather()
        {
            if (NewsWeather != null)
                NewsWeather();
            Console.WriteLine("This is news weather ");
        }
        public void EventNews()
        {
            News();
            Sports();
            Weather();
        }
    }

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

C#
1
2
3
4
5
6
7
8
9
10
11
12
  class Subscriber
    {
        private string _name;
        public Subscriber(string name)
        {
            _name = name;
        }
        public void Subscribe()
        {
            Console.Write("{0},  ", _name);
        }
    }

static void Main()
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 static void Main(string[] args)
        {
            NewsOperator newsOperator = new NewsOperator();
 
            Subscriber alex = new Subscriber("Alex");
            newsOperator.NewsNews += alex.Subscribe;
            newsOperator.NewsSports += alex.Subscribe;
            Subscriber vika = new Subscriber("Vika");
            newsOperator.NewsWeather += vika.Subscribe;
            Subscriber serhei = new Subscriber("Serhei");
            newsOperator.NewsNews += serhei.Subscribe;
            newsOperator.NewsSports += serhei.Subscribe;
            newsOperator.NewsWeather += serhei.Subscribe;
 
            newsOperator.EventNews();
 
            Console.ReadLine();
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.03.2016, 15:20
Ответы с готовыми решениями:

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

Делегаты и события
Помогите, я хочу с помощью += зарегистрировать в событие несколько методов, но хочу сделать так что бы в разных случаях вызывались разные ...

Делегаты и события
Помогите с программой! Должно быть 4 события. Класс «Метеостанция». События «Температура ниже нуля», «Температура выше нуля»,...

7
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
12.03.2016, 19:46
Цитата Сообщение от zSerhei Посмотреть сообщение
delegate void MyEveentHandler();
подписчик получает услугу.
Так а с каких делов делегат без параметров? Там, наверное, должна быть, собственно, сама новость, хотя бы в символическом виде. Обычно в события посылают 2 аргумента: ссылку на объект, который его вызвал(this) и, собственно, данные.
А в целом-ваши классы совершенно непонятно как должны функционировать. Поэтому что правильно/неправильно, тоже сказать трудно. Вы бы лучше поставили более конкретную задачу, и попробовали ее решить.
Про события много инфы в инете, где все разжевывается. Вот например.
И на счет вот этого момента:
C#
1
if (NewsNews != null)
И потокобезопасности отдельная статья есть. Я лично так не пишу. Обычно пустой делегат присваиваю событию сразу вместо этого:
C#
1
public event MyEveentHandler NewsNews = delegate{};
1
12.03.2016, 20:55

Не по теме:

Очень поучительная история из Википедии на тему гонок ->

0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
12.03.2016, 21:04
zSerhei, если делать по всем правилам, скажем так, старо-классический вариант, то и делегаты с событиями не нужны. Ниже пример, как это происходит.
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
76
77
78
79
80
81
82
83
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication5 {
    delegate void CommonDelegate(NewsType newsType);
    class Program {
        static void Main(string[] args) {
            Publisher publisher=new Publisher();
 
            Subscriber sub1=new Subscriber();
            Subscriber sub2=new Subscriber();
            Subscriber sub3=new Subscriber();
 
            publisher.Subscribe(sub1, NewsType.News);
            publisher.Subscribe(sub2,NewsType.News);
            publisher.Subscribe(sub3, NewsType.Weather);
 
            Publisher.FireEvents(NewsType.News);
            Publisher.FireEvents(NewsType.Weather);
            Console.WriteLine();
 
            publisher.Unsubscribe(sub1, NewsType.News);
 
            Publisher.FireEvents(NewsType.News);
            Publisher.FireEvents(NewsType.Weather);
 
            Console.ReadLine();
        }
    }
    public class Publisher {
        static Dictionary<NewsType, List<Subscriber>> subscribers = new Dictionary<NewsType, List<Subscriber>>();
 
        static Publisher() {
            subscribers.Add(NewsType.News, new List<Subscriber>());
            subscribers.Add(NewsType.Sports, new List<Subscriber>());
            subscribers.Add(NewsType.Weather, new List<Subscriber>());
        }
 
        public void Subscribe(Subscriber subscriber, NewsType type) {
            if (!subscribers[type].Contains(subscriber)) {
                subscribers[type].Add(subscriber);
            }
        }
        public void Unsubscribe(Subscriber subscriber, NewsType type) {
            if (subscribers[type].Contains(subscriber)) {
                subscribers[type].Remove(subscriber);
            }
        }
        public static void FireEvents(NewsType newsType) {
           
            var allWhoSubscribe = subscribers[newsType];
            foreach (var s in allWhoSubscribe) {
                s.OnCallback(newsType);
            }
        }
    }
    public class Subscriber {
        public string Name { get; private set; }
        public Subscriber() {
            Name = Guid.NewGuid().ToString();
        }
        public void OnCallback(NewsType type) {
            Console.WriteLine("News type: {0}", type.ToString());
        }
        public override bool Equals(object obj) {
            return this.ToString().Equals(obj.ToString());
        }
        public override int GetHashCode() {
            return this.Name.GetHashCode();
        }
        public override string ToString() {
            return Name;
        }
    }
    
    public enum NewsType {
        News,
        Sports,
        Weather
    }
}
1
12.03.2016, 21:15

Не по теме:

insite2012, а разве кто-то пишет так в реальной жизни на данном языке?

0
12.03.2016, 21:20

Не по теме:

Цитата Сообщение от EvilFromHell Посмотреть сообщение
разве кто-то пишет так в реальной жизни на данном языке?
EvilFromHell, я привел классический вариант. :) И да, есть области, где только такой вариант (ну или почти такой) и возможен. По другому там просто никак. В частности, речь о WCF. Именно такое там и используется.

0
12.03.2016, 21:37

Не по теме:

Цитата Сообщение от insite2012 Посмотреть сообщение
По другому там просто никак. В частности, речь о WCF. Именно такое там и используется.
Мало имел дело с WCF, учту. Но без серьезной необходимости я бы не стал использовать данный паттерн в таком виде. Много лишней писанины. Subscriberов, кстати, полюбому передавать надо бы по интерфейсу:)

0
12.03.2016, 21:40

Не по теме:

Цитата Сообщение от EvilFromHell Посмотреть сообщение
Мало имел дело с WCF, учту
Очень хорошая и полезная технология. Рекомендую.
Цитата Сообщение от EvilFromHell Посмотреть сообщение
Subscriberов, кстати, полюбому передавать надо бы по интерфейсу
В WCF именно так и происходит. Я просто решил не загромождать код, он и так не маленький. :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.03.2016, 21:40
Помогаю со студенческими работами здесь

Делегаты и события
Для данной программы добавить делегат и событие using System; using System.Collections.Generic; using System.Linq; using...

Делегаты и события
Здравствуйте. В C# есть такие 2 темы, как делегаты и события. Я попробовал их изучить, даже код рабочий, но я не понимаю сути. Зачем,...

Делегаты и события
Здравствуйте! Хотелось бы разобраться в событиях исключительно на примере делегатов. Но вот вопрос, ожидаю на выходе: ...

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

Делегаты и события
Нужно создать программу в которой будет Форма (WinForm) и исполняющий код в Program.cs Суть задачи в том чтобы форма ничего не знала о...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru