Я думаю, что мой вопрос лучше всего спросить с примером
Method1(variable var1, variable var2)
{
Method2([null or default value goes here], var1, var2)
}
Method2(variable newvar, variable var1, variable var2)
{
//functionality
}
Будет ли компилятор оптимизировать наш код, изменив все вызовы метода1 на вызов метода 2? Я бы подумал, что он будет встроить метод. Однако, что, если метод2 вызывает 3, который вызывает 4, который вызывает 5, который вызывает 6? Способ метода компилятора1 вызывает вызов метода 6 со значениями, которые он будет иметь?
Это полностью детализация реализации и может быть изменена. Однако команда CLR сообщила о том, когда методы имеют право быть встроенными (хотя это, конечно же, pre-RyuJIT).
Обратите внимание, что компилятор С# никогда не внедряет методы - вложение происходит во время фазы компиляции JIT. В общем, простой вызов метода, как вы описали (без использования используемых виртуальных/абстрактных методов), будет входить во время выполнения.
Method1
(илиMethod2
в этом отношении) практически не экономит время, если только 1)//functionality
является почти ничем, и 2) он вызывается достаточно часто, так что на него приходится хороший процент времени. Поэтому, если / когда компилятор / JITter указывает на это, он делает это только потому, что в некоторых случаях это может помочь.