Почему мы указываем делегат вместе с событием, а не просто используем событие в C #? - PullRequest
0 голосов
/ 13 февраля 2019

Почему мы указываем делегата вместе с событием, почему бы просто не использовать событие в C #?

Например, у меня есть следующий код:

class Shop
{
    internal delegate void _EventHandler(object sender, GoodsInfoEventArgs e);
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}

Почему бы тем, кто разработал C #, не реализовывать события следующим образом:

class Shop
{
    internal event _EventHandler GoodsArrived;

    public void BringGoods(string goods)
    {
        if (GoodsArrived != null)
        {
            GoodsArrived(this, new GoodsInfoEventArgs(goods));
        }
    }
}

Я имею в виду без делегата.

Я знаю, как работает событие в C #.Он просто вызовет всех подписанных делегатов, если они есть, и будет равен нулю в противном случае.А также я знаю о разнице между событием и делегатом.Событие допускает только сложение или вычитание делегатов, но не позволяет изменять указатель (мы можем выполнять операции += и -= над событием, но мы не можем выполнять операцию = над событием), в то время как делегат позволяетвсе операции сложения, вычитания и назначения выполняются.Таким образом, событие является оберткой вокруг делегата, и обертка позволяет контролировать, каким образом делегат может измениться.

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

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

Спасибо.

Прошу прощения за путаницу.Я имел в виду, почему бы не использовать что-то вроде этого:

internal event _EventHandler(object sender, GoodsInfoEventArgs e) GoodsArrived;

?

1 Ответ

0 голосов
/ 13 февраля 2019

Как вы упомянули в своем вопросе, на мероприятии предусмотрен механизм подписки и отписки.Однако делегат должен определить сигнатуру методов, которые могут обработать событие.Существует подпись по умолчанию (void с параметрами sender и args), но вы можете использовать другой тип для EventArgs и также пропустить параметр sender, например.

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

internal event EventHandler GoodsArrived;

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

public class MyEventArgs : EventArgs 
{
  // ...
}

internal event EventHandler<MyEventArgs> GoodsArrived;

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

Решение основывать события на делегатах обеспечивает большую гибкость, которая может вам понадобиться, а может и не понадобиться.Вы можете определять события, которые используют только правильный набор параметров, а также вы можете повторно использовать существующие делегаты для нескольких событий.Стандартные реализации EventHandler значительно упрощают работу и помогают вам определить событие, соответствующее передовым методам (без потери гибкости).

С моей точки зрения и опыта, это не добавит много, чтобы определить подпись непосредственно на мероприятии.Просто используйте готовый делегат EventHandler;Вы можете сразу распознать подпись и не нужно определять делегата самостоятельно.

...