Сведения о вопросе

Oleksandr

11:00, 15th August, 2020

Теги

asp.net   events   webforms    

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

Просмотров: 428   Ответов: 6

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

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

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

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



  Сведения об ответе

nYU

17:27, 1st August, 2020

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

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

Смотрите "Important Note" примерно в середине этой страницы :

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


  Сведения об ответе

crush

04:09, 1st August, 2020

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

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

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


  Сведения об ответе

LIZA

20:07, 3rd August, 2020

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

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

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

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


  Сведения об ответе

ITSME

13:36, 6th August, 2020

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

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


  Сведения об ответе

ASSembler

21:06, 1st October, 2020

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


  Сведения об ответе

LAST

16:57, 24th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться