Переопределенный метод предпочтительнее, так как он будет вызываться полиморфно виртуально 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, который найдет правильный метод экземпляра для вызова в цепочке наследования.