EventHandler Дизайн Практики - PullRequest
0 голосов
/ 09 июля 2010

Я читал, что одно из преимуществ модели MyEventHandler / MyEventArgs заключается в том, что она позволяет стандартным обработчикам событий обрабатывать различные события.Звучит хорошо, но, возможно, я понимаю, как это должно работать.У меня есть следующий код:

public delegate void DataArrivalEventHandler
    (object sender, DataArrivalEventArgs e);

public class DataArrivalEventArgs : EventArgs
{
    public DateTime Arrival { get; protected set; }

    public DataArrivalEventArgs()
    {
        Arrival = DateTime.Now;
    }

    public DataArrivalEventArgs(DateTime arrival)
    {
        Arrival = arrival;
    }
}

...

_pipeReader.DataArrival += new EventHandler(Pipe_DataArrival);

...

private void Pipe_DataArrival(object sender, EventArgs e)
{
    ...
}

Код выдает ошибку при попыткеоднако добавьте обработчик событий, сказав, что он не может приводить к простоте приведения DataArrivalEventHandler к EventHandler.Изменение DataArrivalEventHandler(Pipe_DataArrival) на EventHandler(Pipe_DataArrival) устраняет проблему, поэтому я чувствую, что вы должны иметь возможность добавлять универсальные обработчики событий к более конкретным событиям (я понимаю, почему вы не можете сделать это наоборот).* Насколько у меня это лучший способ сделать это, или есть лучшее соглашение?

Ответы [ 3 ]

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

Я думаю, что противоречивость делегата (назначение делегата EventHandler для DataArrivalEventHandler) не работает в .NET 1.1.Он доступен с версии .NET 2.0

(Ваш код выглядит как код .NET 1.1)

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

Именование

Существует соглашение о присвоении имен для событий.В вашем случае событие должно называться DataArrived.Подробнее здесь: http://msdn.microsoft.com/en-us/library/h0eyck3s(v=VS.71).aspx

Делегаты

У вас есть два делегата для событий, которые следует использовать: EventHandler и EventHandler

Многопоточность

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

public event EventHandler<MyEventArgs> = delegate {};

Таким образом, вам не нужно беспокоиться о проблемах многопоточности.

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

То, как вы это понимаете, верно.

Нет преобразования более конкретного типа делегата в более общий - но равно преобразованию из группа методов с более конкретным набором параметров для типа делегата с более общим набором параметров.(Это работает по-другому для возвращаемых типов.)

Теперь C # 4 немного меняет это, поскольку это преобразование из (скажем) Action<string> в Action<object> - но это только происходит для обобщенных делегатов в терминах параметров их типов.

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