Встраивание - это деталь реализации JIT, а не компилятора C #. Из блога Эрика Ганнерсона :
JIT использует ряд эвристик для
решить, должен ли метод быть
в подкладке.
Ниже приведен список
наиболее значимые из них (примечание
что это не является исчерпывающим):
- Методы, которые больше, чем 32 байта IL, не будут встроены.
- Виртуальные функции не встроены.
- Методы, которые имеют сложное управление потоком, не будут встроены. Сложный
управление потоком является любое управление потоком другой
чем если / то / еще; в этом случае,
переключатель или время.
- Методы, которые содержат блоки обработки исключений, не являются
встроенный, хотя методы, которые бросают
исключения все еще являются кандидатами на
встраивание.
- Если какой-либо из формальных аргументов метода является структурой, метод будет
не быть встроенным.
Хотя ваш метод довольно короткий и не очень сложный, поэтому может соответствовать эвристике, Nullable<T>
- это struct
, поэтому я предполагаю, что ваш метод не встроенный.
Как показывает практика, если использование этого метода повышает производительность, JIT включит этот метод; иначе не будет. Но это действительно деталь реализации JIT, и вы ничего не должны кодировать для:
Я бы внимательно рассмотрел кодирование этих эвристик , поскольку они могут измениться в будущих версиях JIT. Не ставьте под угрозу правильность метода, пытаясь гарантировать, что он будет встроенным.
РЕДАКТИРОВАТЬ: Очевидно, что немного о структурах, не являющихся inline, устарела; обновленную информацию можно найти в блоге Вэнса Моррисона .