Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
bazyzy
8 / 8 / 0
Регистрация: 27.01.2013
Сообщений: 248
#1

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

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

Господа, скажите пожалуйста, для чего использовать ключевое слово event в объявлении события, если события - это те же самые делегаты ? Вроде все прекрасно можно реализовать и без event. По сути объявление поля события - это объявление переменной делегата, в которую в дальнейшем внедряются методы. И соответственно при вызове этого события происходит групповой вызов методов. Спасибо.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2014, 17:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Для чего использовать ключевое слово event в объявлении события, если события — это те же самые делегаты (C#):

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

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

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

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

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

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

1
IamRain
1170 / 1088 / 268
Регистрация: 02.08.2011
Сообщений: 3,208
03.10.2014, 18:17 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Как тут недавно говорили, одно из отличий - при отсутствии подписчиков на событие, его 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2014, 18:17
Привет! Вот еще темы с ответами:

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

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

делегаты и события - C#
Здравствуйте! Помогите пожалуйста с задачей: Есть два делегата: delegate void SimpleDel(string str); delegate void ValueChangeDel(int...

Делегаты и события - C#
Доброго времени суток уважаемые, очень туго идет освоение delegate and event, создал небольшую программку, с таким заданием: (Разработал ...


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

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

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