2010-07-08 4 views
4

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

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?

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

ответ

7

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

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

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

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

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

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

this.OnSomeEvent(); 
+0

Итак, что вы говорите, что OnOneSecond метод функционален просто «лишний» в этом примере? – StingyJack

+0

Он просто не используется, поскольку MyTimerClass ничего не делает. – sunside

0

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

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

0

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

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

2

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

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

Elapsed(source, args) 

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

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

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

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

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

0

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

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

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

Для получения дополнительной информации обратитесь к Events in C# explained in detail

Смежные вопросы