Вызывающие методы базовых Когда Перекрытие уровне страницы События


2

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

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

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

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

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

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

Смотрите «Важное примечание» примерно на полпути вниз this page:

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


0

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

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

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


0

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

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

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

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


0

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

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


0

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


0

@ Ch00k и @Scott I dunno - Мне нравится On EventName модель сама. И да, я один из тех, кто виновен в том, что уволил это событие.

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