オーバーライドされたメソッドは、呼び出されるため優先されます多形的に実質的に CLR によって。
[編集] オーバーライドされたメソッドが望ましいと私が考える理由は次のとおりです。
以下に簡単な例を示します。
class Foo
{
public event EventHandler Changed = delegate { };
protected virtual void OnChanged()
{
this.Changed(this, EventArgs.Empty);
}
}
class Bar : Foo
{
public Bar()
{
this.Changed += new EventHandler(this.Bar_Changed);
}
void Bar_Changed(Object sender, EventArgs e) { }
}
class Baz : Foo
{
protected override void OnChanged()
{
base.OnChanged();
}
}
今、私はこれBaz
がより良い実装であると信じています。ここにその理由があります。 Bar
イベントを接続するには、次の IL 命令を実行する必要があります。
L_000a: ldftn instance void Bar::Bar_Changed(object, class [mscorlib]System.EventArgs)
L_0010: newobj instance void [mscorlib]System.EventHandler::.ctor(object, native int)
L_0015: call instance void Foo::add_Changed(class [mscorlib]System.EventHandler)
のインスタンスである処理メソッドへのデリゲートを作成し、基本クラスのイベントでメソッドをEventHandler
呼び出す必要があります。add_Changed
これらはパフォーマンス キラーではありませんが、動作するために以前のコードは必要ありませんBaz
。への呼び出しOnChanged
はすべて仮想であるため、CLR が継承チェーンで呼び出す正しいインスタンス メソッドを見つけることだけがパフォーマンスの低下となります。