2

イベントをフックすることができ、aspxcodebehindファイルのloadおよびinit..、イベントをオーバーライドすることもできます。以下の質問があります。

public partial class Default : System.Web.UI.Page
{
    public Default()
    {
        this.Init += Default_Init;
        this.Load+=Default_Load;
    }    
    protected void Default_Load(object sender, EventArgs e)
    {        }    
    protected void Default_Init(object sender, EventArgs e)
    {        }    
    protected override void OnLoad(EventArgs e)
    {        }
    protected override void OnInit(EventArgs e)
    {        }
}

Qs:

  1. なぜそのようなオプション(仮想メソッドとイベントハンドラーの両方)がPageクラスに存在するのですか?
  2. オーバーライドメソッドが実行されると、イベントハンドラー(Default_LoadおよびDefault_Init)が実行されません。背後にある理由は何ですか?
  3. base.OnLoad(e);を呼び出す必要があります。オーバーライドされたOnLoadメソッドで?なぜ私はすべき/すべきではないのですか?
4

2 に答える 2

2
  1. デフォルトでは、OnInitおよびはイベントOnLoadのハンドラーではありませんInitLoad彼らは火InitLoadイベントに慣れています。

  2. オーバーライドすると、これらのメソッドの動作が変更されるため、イベントはメソッドによって発生しませんOnInitOnLoad明示的に記述した場合base.OnInitなどを除く)。

  3. OnLoadの動作を変更し、baseメソッドを呼び出さないと、asp.netアプリケーションのページライフサイクルが中断する可能性があります。たとえば、Loadイベントは呼び出されません。

于 2013-02-02T11:18:39.457 に答える
0

通常、このメソッドは。という名前のイベントを発生さOnXxx Xxxます。これは、同様の場合にもSystem.Web.UI.Control当てはまりPageます。

もし、するなら:

protected override void OnLoad(EventArgs e)
{
  // nothing here!
}

の動作を変更して、OnLoad何も実行しないようにします。したがって、おそらく、誰もLoadイベントを発生(「発火」)することはありません。したがって、そのイベントハンドラーは実行されません。

代わりに行う場合:

protected override void OnLoad(EventArgs e)
{
  // maybe add some code of your own here ...
  base.OnLoad(e);
  // ... or here
}

次に、ベース呼び出しは、メソッドが引き続きイベントを発生させることを確認します。

イベントが宣言されたクラスにいる場合は、イベントを明示的に発生させることができます。つまり、基になるデリゲートを呼び出すことができます。ですから、それはあなたにとって可能性ではありません。が定義されている基本クラスLoadは、次のようになります。

// inside same class where 'Load' event is defined:

protected virtual void OnLoad(EventArgs e)
{
  // maybe they put some other code here ...

  var loadDelegate = Load;   // gets the current underlying delegate of the event
  if (loadDelegate != null)
    loadDelegate(this, e);

  // ... or here
}

しかし、ほとんどの場合、overrideどのような方法も使用すべきではありません。Loadイベントが発生したときにコードを実行する場合に追加するだけですLoad

于 2013-02-02T11:47:32.200 に答える