2013-04-01 3 views
2

Мне было интересно, какое точное использование событий находится в C#. Я все еще участвую в обучении C#, поэтому я, возможно, что-то пропустил, но можно просто использовать делегатов.
В этом примере я написал класс с методом, который насчитывает от 0 до 2^64, и каждый раз, когда он достигает нескольких тысяч, возникает событие. Вот код:Использование ключевого слова события в C#

namespace EventDelegate 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     EventRaiserClass _eventraiser = new EventRaiserClass(); 
     _eventraiser.handler = SomeEventHandler; 
     _eventraiser.handler += AnotherEventHandler; 
     _eventraiser.Loop(); 
     Console.Read(); 
    } 

    static void SomeEventHandler(object sender, EventArgs args) 
    { 
     Console.WriteLine("Event raised"); 
    } 

    static void AnotherEventHandler(object sendr, EventArgs args) 
    { 
     Console.WriteLine("Event raised (Another handler)"); 
    } 
} 

public delegate void Handler(object sender, EventArgs args); 

class EventRaiserClass 
{ 
    public Handler handler; 
    public void Loop() 
    { 
     for (long i = 0; i < Int64.MaxValue; i++) 
     { 
      if ((i % 1000) == 0) 
      { 
       EventArgs args = new EventArgs(); 
       RaiseEvent(args); 
       System.Threading.Thread.Sleep(1000); 
      } 
     } 
    } 

    private void RaiseEvent(EventArgs args) 
    { 
     if (handler != null) 
      handler(this, args); 
    } 
} 

}

Что бы разница была, если бы я объявил переменную handler делегата, чтобы быть событием, как этот public event Handler handler.
Извините, если я был немного расплывчатым или отсутствовал что-то очевидное, но мне просто интересно, если что-то еще происходит за кулисами при использовании event, а просто с помощью делегатов или если это просто для удобства чтения.

+1

возможно дубликат [Понимание событий и обработчиков событий в C#] (http://stackoverflow.com/questions/803242/understanding-events-and-event-handlers-in-c-sharp) –

+3

См. http://csharpindepth.com/Articles/Chapter2/Events.aspx –

+0

Спасибо, я посмотрю. –

ответ

2

События и делегаты схожи, но события более ограничены по уважительным причинам.

В вашем коде вы можете делать всевозможные вещи с помощью _eventraiser.handler снаружи. Однако вы не должны делать большинство из этих вещей.

Рассмотрим следующую строку:

_eventraiser.handler = SomeEventHandler; 

Если вы используете делегатов, вы должны проверить каждый раз, когда вы пытаетесь прикрепить обработчик события, если делегат null, а затем инициализировать его с =, и если он не является нулевым, вам просто нужно добавить обработчиков с +=. Если вы забудете инициализацию, вы получите исключение с нулевой ссылкой, если вы добавите слишком много, вы перезапишете все предыдущие вещи.

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

То же самое касается Invoke, и все, что вы можете сделать с делегатом: их нет для событий. Единственное, что вы можете сделать с событием из внешнего класса: += и -=, вот оно. Вы можете просматривать их в качестве делегатов с помощью специального открытого интерфейса со сложными геттерами и сеттерами.

(События также имеют специальный add и remove синтаксис, но это довольно редко используемое свойство)

+0

Спасибо за помощь.Я вернулся к коду и сделал делегату событие, после которого я получил ошибку в этой строке '_eventraiser.handler = SomeEventHandler; ', которая попыталась бы перезаписать все ранее подписанные методы. :-) –

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