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

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

Войти
Регистрация
Восстановить пароль
 
bazyzy
8 / 8 / 0
Регистрация: 27.01.2013
Сообщений: 248
#1

Определить, вызывает ли в приведенном коде метод событие или наоборот - C#

23.09.2014, 17:48. Просмотров 424. Ответов 8
Метки нет (Все метки)

Господа просветите пожалуйста по событиям. Читаю по Шилдту, то ли перевод такой. То ли я не могу разобраться. Вот код который приводится в книге в качестве примера
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
using System;
 
delegate void MyEventHandler();
 
class MyEvent { 
  public event MyEventHandler SomeEvent;
 
  public void OnSomeEvent() { 
    if(SomeEvent != null) 
      SomeEvent(); 
  } 
}
 
class EventDemo { 
    static void Handler() { 
    Console.WriteLine("Event occurred"); 
  }
 
  static void Main() {  
    MyEvent evt = new MyEvent();
 
    evt.SomeEvent += Handler;
 
    evt.OnSomeEvent(); 
  } 
}
С кодом вроде все понятно. Но вот его дальнейшее описание вводит в заблуждение. Подскажите пожалуйста это трудности перевода или трудности в моем понимании темы
1. Цитата Кроме того, в классе MyEvent объявляется метод OnSomeEvent (), вызываемый для сигнализации о запуске события. Это означает, что он вызывается, когда происходит событие.
Я не пойму метод вызывает событие или событие метод ? Я так понял, что метод OnSomeEvent () вызывает событие.
2. Цитата В методе OnSomeEvent () вызывается обработчик событий с помощью делегата SomeEvent.
Но имя делегата вроде MyEventHandler ? Или я что-то не понял ?
3. Цитата Вызов метода OnSomeEvent () приводит к вызову всех событий, зарегистрированных обработчиком.
Может быть правильно к вызову всех зарегистрированных ОБРАБОТЧИКОВ для события ?
И еще вопросик совсем мелкий. Правильно ли я понял, что в методе OnSomeEvent() происходит все таким образом, что в методе сигнализируется само событие и автоматически (если подключен) вызывается его обработчик ?

Спасибо. Для меня очень важно получить ответы. Спасибо еще раз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2014, 17:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить, вызывает ли в приведенном коде метод событие или наоборот (C#):

Метод Холецкого - исправить ошибку в приведенном коде - C#
Имеется матрица 3х3.Нужно решить ее при помощи метода Холецкого(Квадратного корня ). Написал вот такой код.Но x_vector считает не...

Что можно оптимизировать или улучшить в приведенном коде - C#
using System; using System.Collections.Generic; namespace ConsoleApplication1 { public interface IPerson { ...

Таймер вызывает событие только один раз - C#
Доброго времени суток. Будтъте добры подскажите, затупил. Есть такой класс. Я его конструирую, потом вызываю BeginStart. В результате...

Как сделать событие (или метод), который постоянно будет проверять наши действия? - C#
Здравствуйте. Вот сижу и думаю. К примеру, в WindowsForms есть события, которые реагируют на какое действие. Вот вопрос: как сделать...

Найти ошибку в приведенном коде - C#
using System; namespace Distinct { class Program { static void Main(string args) { ...

Найти ошибку в приведенном коде - C#
Программа полностью написана только вот при выводе результата ошибка какая то высвечивается using System; using...

8
IamRain
1098 / 1014 / 256
Регистрация: 02.08.2011
Сообщений: 3,047
23.09.2014, 18:39 #2
1. Да, все верно, всегда создается специальный метод, обычно protected (чтобы можно было переопределять в производных классах), для генерации события.
2. События - это тоже делегаты, специализированные делегаты, по сути, реализация паттерна "Наблюдатель".
Вообще, если смотреть с точки зрения синтаксиса языка, и если забыть про ключевое слово event, то вы просто объявили поле типа вашего делегата и операцией += добавляете в его InvocationList подписавшиеся методы.
3. Тонкости перевода . Для меня это одна из причин чтения англоязычных источников.
И про последний вопрос - да все верно. Для закрепления материала - почему идет проверка на !=null в методе генерации события? Чтобы лучше усвоить: почитайте еще раз про делегаты.
1
Learx
1035 / 842 / 86
Регистрация: 31.03.2010
Сообщений: 2,465
23.09.2014, 18:45 #3
Цитата Сообщение от bazyzy Посмотреть сообщение
1. Цитата Кроме того, в классе MyEvent объявляется метод OnSomeEvent (), вызываемый для сигнализации о запуске события. Это означает, что он вызывается, когда происходит событие.
есть событие, однако чтоб сообщить программе, что это событие произошло мы используем метод. само по себе событие не вызывается.
Цитата Сообщение от bazyzy Посмотреть сообщение
2. Цитата В методе OnSomeEvent () вызывается обработчик событий с помощью делегата SomeEvent.
Но имя делегата вроде MyEventHandler ? Или я что-то не понял ?
MyEventHandler - это тип делегата. делегировать можно только функции с одинаковой структурой. то есть для функций int FuncName() и void FuncName() следует использовать разные делегаты. И да тут что-то с переводом, потому что SomeEvent - это событие, а не делегат.
Цитата Сообщение от bazyzy Посмотреть сообщение
3. Цитата Вызов метода OnSomeEvent () приводит к вызову всех событий, зарегистрированных обработчиком.
Каждый обработчик сам регистрируется на событие. да тут вернее сказать "вызов всех делегатов, которые зарегистрировали обработчики"
думаю, я уже ответил на последний вопрос
1
KeBJIaP
144 / 141 / 17
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
23.09.2014, 18:47 #4
1) Чтобы запустить событие - ты в этом объекте используешь метод OnSomeEvent(), который является оболочкой для самого события. Если этого не делать, то в случае если никто не подпишется на это событие и оно будет возбуждено - вылетит исключение о пустом делегате(или еще какое не помню).
2) Событие - по сути это тоже делегат такой. с сигнатурой EventHandler`а
3) Ну ты можешь в OnSomeEvent много событий напихать, хотя смысл в этом?? тут я и сам не очень понял.
1
bazyzy
8 / 8 / 0
Регистрация: 27.01.2013
Сообщений: 248
23.09.2014, 18:55  [ТС] #5
Уважаемые, всем огромное спасибо, что развеяли мрак в переводе книги. Все-таки дело оказалось в переводе + немного проблем у меня с пониманием того что события - это такие "извращенные" делегаты. Особенно первая цитата меня просто дизориентировала, так как по ней в буквальном смысле выходило, что событие САМО вызывало метод для вызова события ))). Спасибо господа. Очень помогли хоть немного разобраться
0
Learx
1035 / 842 / 86
Регистрация: 31.03.2010
Сообщений: 2,465
23.09.2014, 19:04 #6
KeBJIaP, событие - это не делегат, это контейнер делегатов. отличается он от делегата тем, что не отвечает на событие, если нет подписчиков - та самая ошибка. и тем,что обеспечивает потокобезопасность, если подписчик создан в другом потоке.
а смысл напихать много делегатов в том, что на одно событие реагирует несколько объектов. например, при клике мышкой реагирует не только окно, но и элемент управления одновременно.
2
KeBJIaP
144 / 141 / 17
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
24.09.2014, 11:32 #7
Спасибо, хочу тебя поправить тоже в свою очередь)) Не надо исключение называть ошибкой, особенно в теме где человек начинает изучать язык) Исключение - это просто способ ветвления кода.
0
Learx
1035 / 842 / 86
Регистрация: 31.03.2010
Сообщений: 2,465
24.09.2014, 11:40 #8
KeBJIaP, исключение - это инструмент созданный для возможности ветвления кода при возникновении ошибки.
0
KeBJIaP
144 / 141 / 17
Регистрация: 21.01.2012
Сообщений: 545
Завершенные тесты: 1
24.09.2014, 13:53 #9
Learx, В контексте твоего сообщения - если нет подписчиков, то это не ошибка. Такое вполне имеет право быть. Но исключение будет брошено.
0
24.09.2014, 13:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2014, 13:53
Привет! Вот еще темы с ответами:

Исправить ошибку в приведенном коде - C#
public partial class Form1 : Form { rRZR rfiles; private void button1_Click(object sender, EventArgs e) ...

Исправить ошибки в приведенном коде - C#
в скриншоте всё

Исправить ошибку в приведенном коде - C#
{ class Program { public struct Point { public int X; public int Y; ...

.NET 4.x Заменить for на foreach в приведенном коде - C#
Господа, объясните пожалуйста как в программе: using System; using System.Collections.Generic; using System.Linq; using...


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

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

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