Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
1

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

03.10.2014, 17:19. Просмотров 2811. Ответов 1
Метки нет (Все метки)


Господа, скажите пожалуйста, для чего использовать ключевое слово event в объявлении события, если события - это те же самые делегаты ? Вроде все прекрасно можно реализовать и без event. По сути объявление поля события - это объявление переменной делегата, в которую в дальнейшем внедряются методы. И соответственно при вызове этого события происходит групповой вызов методов. Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2014, 17:19
Ответы с готовыми решениями:

делегаты и события. Как их использовать и где?
вот занимаюсь по книжке С#3.0 справочник братьев Албахари и что-то засел с делегатами и событиями....

использовать обработку события по изменению данных DataGridView в обработке события сторонней кнопки
Имеется некий DataGridView, при изменении данных в определенной ячейке которого создается...

Почему если делегат события определен в другом классе, то не получается создать генерацию события?
В проекте №1 объявлен делегат для события: delegate void StateEventHandler(State state); А в...

Ключевое слово static в объявлении функции
Доброго времени суток. У меня возник вопрос по поводу использования слово static в объявлении...

1
2262 / 1720 / 511
Регистрация: 02.08.2011
Сообщений: 4,909
03.10.2014, 18:17 2
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Как тут недавно говорили, одно из отличий - при отсутствии подписчиков на событие, его rising не выбрасывает исключение. Плюс потокобезопасность при добавлении/удалении подписчиков из разных потоков.
Сам еще до конца не штудировал эту тему, а точнее успел подзабыть, но вот неплохой материал:
1.Хабр
2. Сlr via C# 3-ее издание (глава 11 - события и глава 17 - делегаты)

Добавлено через 17 минут
А не, тот кто говорил про выбрасывание исключений, нагло ВРАЛ. Проверьте, как ведут себя делегат и событие при отсутствии подписчиков: ( в обоих случаях Nullreference exception, оба делегата становятся равными Null)
Значит только разница в потокобезопасности. Но все же прочитайте указанные ресурсы.
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
public class TestClass
    {
        public Action SomeAction;
        public event EventHandler MyEvent;
 
        public void FireEvent()
        {
            MyEvent(this, new EventArgs());
        }
    }
 
class Program
    {
        static void Main(string[] args)
        {
            var tc = new TestClass();
            tc.SomeAction += Method;
            tc.SomeAction();
 
            tc.SomeAction -= Method;
            tc.SomeAction();
 
 
            tc.MyEvent += MyEventHandler;
            tc.FireEvent();
 
            tc.MyEvent -= MyEventHandler;
            tc.FireEvent();
            
            Console.ReadKey(true);
        }
 
        private static void Method()
        {
            Console.WriteLine("I am a subscriber of delegate.");
        }
 
        private static void MyEventHandler(object obj, EventArgs e)
        {
            Console.WriteLine("I am a subscriber of event.");
        }
    }
Добавлено через 6 минут
Вообще, почти цитируя одного из местных авторитетов (да простит меня сенсей ):
"События - специализированные делегаты, по сути формализация паттерна public-subscribe".

Цитата отсюда: Снова хабр
0.Событие — это тот же самый делегат, который наделяется некоторыми свойствами через слово event.
1. И событие и делегат можно объявить полем класса, но в отличие от делегата, событие не может быть локальной переменной метода (особо не роляет, но помнить стоит)
2. Событие нельзя запустить вне класса, в котором оно было объявлено (это самое важное отличие!!!)
3. Интерфейс не может содержать поля.
4. Событие всегда объявляется как «поле», а не свойство (add-remove не в счет).

Это, пожалуй, единственные отличия события от делегата (я не берусь рассматривать семантическую разницу). Ну, или я что-то забыл, но вы мне сейчас напомните
Добавлено через 2 минуты
И про потокобезопасность тоже нужно самому проверить.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2014, 18:17

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Для чего необходимо ключевое слово typename
Исходные данные. Есть класс CAppContainer, заголовочный файл appcontainer.h: #ifndef...

Для чего ключевое слово virtual в EF Code First
Добрый день! Подскажите пожалуйста для чего необходимо слово "virtual" в EF Code First? public...

как обойти ошибку компиляции Compile error при объявлении события для несуществующей библиотеки?
Доброго времени суток, уважаемые форумчане! Поиск в интернете и вопрос на другом форуме результатов...

Не срабатывают события, если использовать тот же самый элемент в шаблоне
В silverlight не срабатывают события, если использовать тот же самый элемент в шаблоне. ...

Делегаты и события
using System; using System.IO; namespace Глава_15_завершение { public delegate void...

события, делегаты.
как можно отловаить событие изменения значения? допустим есть класс class first{ int var;...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.