Вызов базовых методов При Переопределении Событий на уровне Страницы

StackOverflow https://stackoverflow.com/questions/19294

  •  09-06-2019
  •  | 
  •  

Вопрос

В моем коде позади я подключаю свои события следующим образом:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    btnUpdateUser.Click += btnUpateUserClick;
}

Я сделал это таким образом, потому что именно это я видел в примерах.

  • Нужно ли вызывать метод base.OnInit()?
  • Будет ли это вызываться неявно?
  • Лучше ли вызывать его в начале метода или в конце?
  • Какой был бы пример, когда путаница в отношении базового метода может привести к неприятностям?
Это было полезно?

Решение

Я должен уточнить:

Руководящие принципы рекомендуют, чтобы запуск события включал вызов виртуального "ВклИмя события" метод, но они также говорят, что если производный класс переопределяет этот метод и забывает вызвать базовый метод, событие все равно должно сработать.

Смотрите "Важное примечание" примерно на полпути вниз эта страница:

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

Другие советы

В этом случае, если вы не вызовете базовый OnInit, то Init даже не сработает.

В общем, наилучшей практикой является ВСЕГДА вызывать базовый метод, если только вы конкретно не знаете, что не хотите, чтобы происходило базовое поведение.

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

Хотя официальные рекомендации по разработке фреймворка рекомендуют иное, большинство разработчиков классов фактически назначают метод OnXXX() ответственным за запуск фактического события, например:

protected virtual void OnClick(EventArgs e)
{
    if (Click != null) Click(this, e);
}

...поэтому, если вы наследуете от класса и не вызываете base .OnClick(e) , событие Click никогда не сработает.

Так что да, даже несмотря на то, что это не должен в соответствии с официальными рекомендациями по дизайну, я думаю, стоит вызвать base.OnInit(e) на всякий случай.

официальные рекомендации по разработке фреймворка рекомендуют иное

Они это делают?Мне любопытно, я всегда думал об обратном, и чтение Рекомендаций по разработке фреймворка и запуск FxCop только укрепили мое мнение.У меня сложилось впечатление, что события всегда должны запускаться из виртуальных методов OnXXX(), которые принимают параметр EventArgs

Вероятно, вам лучше поступить именно так, тогда этот спор прекратится.Тем не менее, статья интересная, особенно учитывая, что .NET Framework не соответствует этому руководству.

@Ch00k и @Scott Я не знаю - мне нравится Вкл.Имя события рисую себя по образцу.И да, я один из тех, кто виновен в запуске события таким методом.

Я думаю, что переопределение метода On * и вызов базового - это правильный путь.Обработка ваших собственных событий кажется какой-то неправильной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top