重写的方法是可取的,因为它实际上将由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