Как? Взглянуть на Carel Lotz блог .
Почему? Существует несколько причин, что я могу думать:
статья Martin Fowler о Непрерывная Интеграция остается категорическим текстом. Взгляните на него!
Встраивание - это деталь реализации JIT, а не компилятора C #. Из блога Эрика Ганнерсона :
JIT использует ряд эвристик для решить, должен ли метод быть на подкладке. Ниже приводится список более значительный из них (примечание что это не является исчерпывающим):
- Методы, размер которых превышает 32 байта IL, не будут встроены.
- Виртуальные функции не встроены.
- Методы со сложным управлением потоком не будут встроены. Сложный управление потоком - любое другое управление потоком чем if / then / else; в этом случае, switch или while.
- Методы, содержащие блоки обработки исключений, не встроенные, хотя методы, которые бросают исключения по-прежнему являются кандидатами на встраивание.
- Если какой-либо из формальных аргументов метода является структурами, метод будет не быть встроенным.
Хотя ваш метод довольно короткий и не очень сложный, поэтому он может соответствовать эвристике, Nullable
- это структура
, поэтому я предполагаю, что ваш метод не встроен.
Как показывает практика, если встраивание этого метода улучшает производительность, JIT будет встроить этот метод; иначе не будет. Но на самом деле это деталь реализации JIT, и вы не должны кодировать ничего для этого:
Я бы внимательно рассмотрел возможность явного кодирования этих эвристик , потому что они могут измениться в будущих версиях JIT. Не идите на компромисс с правильностью метода, пытаясь гарантировать, что он будет встроен.
РЕДАКТИРОВАТЬ: Очевидно бит о структурах, которые не встраиваются, устарел; обновленную информацию можно найти в блоге Вэнса Моррисона .