Это быстрее; используя event.Invoke(args)
или просто вызывая event(args)
. Какая разница? Быстрее или медленнее, чем другой; или это просто вопрос предпочтения?
Event.Invoke(args) против события (args). Что быстрее?
Ответ 1
Запись someDelegate(...)
является сокращением компилятора для someDelegate.Invoke(...)
.
Они оба скомпилируются с той же командой IL — a callvirt
на этот тип типа делегата Invoke
.
Метод Invoke
генерируется компилятором для каждого конкретного типа делегата.
Напротив, метод DynamicInvoke
, определенный в базовом типе Delegate
, использует отражение для вызова делегата и медленный.
Ответ 2
Когда вы вызываете event(args)
, компилятор С# превращает его в вызов IL для event.Invoke(args)
. Это то же самое - например, с помощью string
или System.String
.
Ответ 3
Оба способа в конечном итоге генерируют точно такой же IL, поэтому нет никакой разницы в их вызове.
Если у вас проблемы с производительностью, такие изменения вряд ли помогут вам, если вообще. Если у вас нет проблем с производительностью, тогда нет причин задавать такие вопросы вообще.
Ответ 4
С введением null-conditionals в С# 6.0, Invoke
можно использовать для упрощения поточной проверки нуль делегатов, Если раньше вам приходилось делать что-то вроде
var handler = event;
if (handler != null)
handler(args);
комбинация ?.
и Invoke
позволяет просто написать
event?.Invoke(args)