2014-01-29 5 views
-1

Право, я прочитал все страницы, на которых я могу получить информацию, которые обеспечивают простую реализацию события в C# (1, 2, 3). Я просто не могу заставить мое мероприятие работать. Я переношу программу с VB.net, где она была очень проста в использовании событий.Внедрение события в C#

Так класс, который вызывает событие:

class TickerClass 
    { 

     // Event Setup 
    public EventArgs e = null; 
    public delegate void UpdateEventHandler(TickerClass t, EventArgs e); 
    public event UpdateEventHandler Update; 

    void doSomethingAndRaiseTheEvent() 
    { 
     Update(this, null); 
    } 
} 

Класс, который создает экземпляр TickerClass и обрабатывает событие:

public class Engine 
{ 

    TickerClass ticker; 

    // constructor 
    public Engine() 
    { 
     ticker = new TickerClass(); 

     // subscribe to the event 
     ticker.Update += new TickerClass.UpdateEventHandler(TickerUpdated); 
    } 

    // method to call when handling the event 
    public void TickerUpdated() 
    { 
    //do stuff with ticker 
    } 

} 

Что случилось с этой реализации?

+0

Я буквально вычислил это через 1 секунду после размещения вопроса. Думаю, я это понял ... Мне нужно изменить подпись .TickerUpdated(), чтобы она соответствовала имени делегата, а не я? – rex

+0

Не компилируется? Должны ли мы догадываться, какая у вас проблема? Сторона примечания: +1 голос действительно странный для меня на вопрос, который вообще ничего не говорит о проблеме. –

ответ

4

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

Даже подпись указывает, что она принимает TickerClass и EventArgs в качестве параметров метода. У вашего обработчика событий нет ни одного.

Как только вы исправите подпись, пример будет работать.

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

Вам также не нужно явно указывать тип делегата при добавлении обработчика событий. Компилятор может вывести его, если задано ticker.Update += TickerUpdated.

+0

Спасибо Servy, вы отвечаете правильно, но мне также нравятся ваши предложения. – rex

3

TickerUpdated должен иметь подпись, которая соответствует вашему UpdateEventHandler определения:

public void TickerUpdated(TickerClass sender, EventArgs e) 
{ 
    // This will work now 

Обратите внимание, что вместо передачи null при подъеме события, также было бы хорошая идея использовать EventArgs.Empty, а также проверить null на обработчике по идиоматическому пути:

void doSomethingAndRaiseTheEvent() 
{ 
    var handler = this.Update; 
    if (handler != null) 
     handler(this, EventArgs.Empty); 
} 
Смежные вопросы