Нужна помощь в понимании событий в C # - PullRequest
4 голосов
/ 08 июля 2010

Я новичок в C # и испытываю трудности с пониманием событий в C #. Книга, которую я прочитал (Иллюстрированный C # 2008), дает пример об этом, и есть несколько вещей, о которых мне нужно спросить, так что я буду в прошломкод здесь и укажите вещи, которые я не понимаю.

public class MyTimerClass
{
   public event EventHandler Elapsed;
   private void OnOneSecond(object source, EventArgs args)  
   {
     if (Elapsed != null)                
     Elapsed(source, args);
   }
}

class ClassA
{
    public void TimerHandlerA(object obj, EventArgs e) // Event handler
    {
        Console.WriteLine("Class A handler called");
    }
}

class ClassB
{
    public static void TimerHandlerB(object obj, EventArgs e) // Static
    {
        Console.WriteLine("Class B handler called");
    }
}

class Program
{
     static void Main( )
     {
         ClassA ca = new ClassA(); // Create the class object.
         MyTimerClass mc = new MyTimerClass(); // Create the timer object.
         mc.Elapsed += ca.TimerHandlerA; // Add handler A -- instance.
         mc.Elapsed += ClassB.TimerHandlerB; // Add handler B -- static.
         Thread.Sleep(2250);
     }
}

Хорошо, теперь строка после объявления события здесь public event EventHandler Elapsed; , что private void OnOneSecond(object source, EventArgs args) я знаю, что две строки после негопроверить, содержит ли событие методы или нет, но для чего нужен OnOneSecound?или когда это называется?или как он называется .. это не обработчик событий, я думаю, верно?и каковы отношения между Elapsed и OnOneSecond?

извините за вопрос новичка .. и заранее спасибо:)

Ответы [ 5 ]

7 голосов
/ 08 июля 2010

метод OnOneSecond будет вызываться внутренне MyTimerClass, когда ему потребуется вызвать событие.

Это общий шаблон, используемый большинством элементов управления, в том числе Microsoft.

Обычно вам не нужно проверять, установлено ли событие в нескольких местах, вы просто делаете это в этом одном методе, а затем вызываете этот метод внутри, чтобы вызвать событие.

Я склонен не передавать аргументы событий в метод OnXXX, например.

public event EventHandler<EventArgs> SomeEvent;
protected virtual void OnSomeEvent()
{
    if (this.SomeEvent !=null)
    {
        this.SomeEvent.Invoke(this,EventArgs.Empty);
    }
}

затем поднять его

this.OnSomeEvent();
2 голосов
/ 08 июля 2010

Это метод, который вы вызываете, чтобы безопасно вызвать событие.

проблема в том, что вы в основном можете вызвать

Elapsed(source, args)

, но если к событию не подключен никто,это вызовет исключение Reference Null.поскольку событие является нулевым, когда его никто не слышит.

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

public event Action<EventArgs> Elapsed = val => { };

(обратите внимание, что с = его непосредственно назначенным. val => { } является лямбда-выражением, которое определяет пустого подписчика.)

Также,загляните в Reactive Framework для .net , если вы хотите делать много событий, это правильное решение.

0 голосов
/ 04 февраля 2015

События - это механизм, позволяющий узнать, что произошло что-то интересное.

События используют делегатов для ведения списка подписчиков.Делегаты содержат ссылки на подписанные методы обработки событий, но не знают о классах, которые определили методы обработки событий.Это означает, что класс, который вызывает событие, не имеет прямой связи с классом, подписавшимся на событие.

Таким образом, использование событий делает классы в приложении слабо связанными друг с другом.Это преимущество использования событий и делегатов в дизайне приложения.

Для получения дополнительной информации см. События в C #, подробно объясненные

0 голосов
/ 08 июля 2010

OnOneSecond - это просто вспомогательный метод, определенный для вызова события.Вы можете использовать события без таких методов, это просто установленный шаблон для переноса проверки if (Elapsed != null) в методе с именем, начинающимся с On ...

Технически вы можете просто использовать Elapsed(source, args) вместоOnOneSecond(source, args), но будет выдано NullReferenceException, если слушатели не зарегистрированы.

0 голосов
/ 08 июля 2010

Это позволяет вам вручную запускать события из класса.

Это стандартный шаблон для вызова внутренних событий, поэтому он является закрытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...