重寫的方法是可取的,因爲它實際上將由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在繼承鏈中找到調用正確的實例方法。
你能否再解釋一下 - 我不確定我明白你的意思。 – 2009-02-11 16:27:06