Подтвердить что ты не робот

Event.Invoke(args) против события (args). Что быстрее?

Это быстрее; используя event.Invoke(args) или просто вызывая event(args). Какая разница? Быстрее или медленнее, чем другой; или это просто вопрос предпочтения?

4b9b3361

Ответ 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)