Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2016, 19:50   #1
BadCats
Пользователь
 
Аватар для BadCats
 
Регистрация: 31.01.2016
Сообщений: 67
По умолчанию перевызов событий?

всем привет, имеется данный пример:
Код:
public delegate void EventDelegate();

    public class MyClass
    {
        public event EventDelegate myEvent = null;

        public void InvokeEvent()
        {
            myEvent.Invoke();
        }
    }

    class Program
    {
        // Методы обработчики события.

        static private void Handler1()
        {
            Console.WriteLine("Обработчик события 1");
        }

        static private void Handler2()
        {
            Console.WriteLine("Обработчик события 2");
        }

        static void Main()
        {
            MyClass instance = new MyClass(); 

            // Присоединение обработчиков событий. (Подписка на событие)
            instance.myEvent += new EventDelegate(Handler1);
            instance.myEvent += Handler2;

            // Метод который вызывает событие.
            instance.InvokeEvent();

            Console.WriteLine(new string('-', 20));

            // Открепляем Handler2().
            instance.myEvent -= new EventDelegate(Handler2);

            instance.InvokeEvent();

            // Delay.
            Console.ReadKey();
        }
    }
Зачем тут метод InvokeEvent, который перевызывает событие myEvent?

Зачем вообще перевызывать событие? Почему не вызвать его "напрямую" - как метод?
BadCats вне форума Ответить с цитированием
Старый 29.07.2016, 20:12   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Видимо автор так захотел. Разницы вроде бы нет.

Не надо в Помощи студентам создавать такие темы, для этого есть нормальные разделы.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 29.07.2016, 21:29   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

разницы нет абсолютно.

оборачивают обычно или события с параметрами(см события с компонентами) и/или при защищенном вызове(в вашем случае, если на событие никто не подписан, то будет NRE(Null Reference Exception)).
обычно делают так
Код:
public void InvokeEvent()
{
   var handler=myEvent;
   if(handler!=null)
       handler.Invoke();
}
что убирает так же возможное состояние гонки.(если поставить само событие напрямую, то может быть (при многопоточности) что проверили, все ок, но после проверки на null другой поток отписался от события и оно снова null)
или если у вас не старая версия в дотнете в цели можно просто
Код:
myEvent?.Invoke();
PS: кстати и Invoke писать не обязательно(если не использован оператор ?.)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгебра событий Diana528 Общие вопросы C/C++ 15 26.11.2013 08:45
Обработчик событий strangegirlXX JavaScript, Ajax 7 06.04.2013 00:38
Планировщик событий Евгений_Магистр Общие вопросы Delphi 10 05.10.2012 23:19
обработчик событий IIaJIbI4 БД в Delphi 2 07.06.2011 15:09
Реализация событий в С++ sofen.ru Visual C++ 3 03.11.2010 18:51