重写的方法是可取的,因为它将被调用多态的几乎由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 在继承链中找到正确的实例方法来调用。