Я думаю, что разница в производительности между двумя подходами недостаточно велика , чтобы иметь значение.Во всяком случае, я бы сказал, что проверка на нуль * на 1005 * дешевле , чем вызов метода через делегат, даже если это неоперация.
Когда речь идет о элегантность , следует отметить, что ключевое слово RaiseEvent
в VB.NET автоматически расширяется компилятором до той же самой конструкции, которую вы должны написать сами в C #:
If (Not MyEvent Is Nothing) Then
MyEvent.Invoke(New EventArgs())
End If
Если вы хотите избежать повторения этой конструкции во всем коде, вы можете инкапсулировать ее в несколько методов расширения:
public static void RaiseEvent(this EventHandler source, object sender)
{
if (source != null)
{
source.Invoke(sender, new EventArgs());
}
}
public static void RaiseEvent<T>(this EventHandler<T> source, object sender, T eventArgs)
where T : EventArgs
{
if (source != null)
{
source.Invoke(sender, eventArgs);
}
}
Таким образом, вы можете просто сказать:
myEvent.RaiseEvent(this);
myOtherEvent.RaiseEvent(this, new SomeEventArgs());
, чтосемантически эквивалентен стилю, используемому в VB.NET.