Вызов базовых методов при переопределении событий уровня страницы - PullRequest
2 голосов
/ 21 августа 2008

В своем коде я связываю свои события так:

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

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

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

Ответы [ 6 ]

3 голосов
/ 21 августа 2008

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

В руководящих принципах рекомендуется, чтобы при запуске события использовался виртуальный метод «On EventName », но также говорится, что если производный класс переопределяет этот метод и забывает вызывать базовый метод, событие должно все еще огонь.

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

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

0 голосов
/ 21 августа 2008

@ Ch00k и @Scott Я не знаю - мне самому нравится шаблон On EventName . И да, я один из тех, кто виновен в том, что запустил событие из этого метода.

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

0 голосов
/ 21 августа 2008

Возможно, вам лучше так поступить, тогда эта дискуссия уйдет. Однако статья интересна, особенно если учесть, что .NET Framework не соблюдает это руководство.

0 голосов
/ 21 августа 2008

Официальные рекомендации по проектированию каркаса рекомендуют иначе

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

0 голосов
/ 21 августа 2008

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

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

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

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

0 голосов
/ 21 августа 2008

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

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

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

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