Вот что вы должны сделать, чтобы исследовать это.
Начните с переписывания программы, чтобы она дважды выполняла все .Поместите окно сообщения между двумя итерациями.Скомпилируйте программу с включенной оптимизацией и запустите программу , а не в отладчике .Это гарантирует, что джиттер генерирует наиболее оптимальный код, который он может.Джиттер знает, когда подключен отладчик, и может генерировать худший код, чтобы облегчить отладку, если он считает, что это то, что вы делаете.сборка кода уровня в трех разных версиях кода, если на самом деле есть даже три разные версии.Я был бы готов поставить столько, сколько доллар, что ни один код не был сгенерирован для первого, потому что джиттер знает, что все это можно оптимизировать так, чтобы он «возвращал ложь», а затем этот возврат ложь можно было бы встроить,и, возможно, даже петля может быть удалена.
(В будущем вы, вероятно, должны учитывать это при написании тестов производительности. Помните, что если вы не используете результат , тогда джиттер свободен для полной оптимизации всего, который выдает этот результат, при условии, что он не имеет побочного эффекта.)
Как только вы посмотрите на код сборки, вы увидите, что происходит.
Я лично не исследовал это лично, но есть вероятность, что происходит следующее:
в коде int, джиттер понимает, что в штучной упаковкеint никогда не имеет значения null и превращая метод в «return false»
в строковом коде пути, джиттер понимает, что проверка строки на нуль эквивалентна проверке, является ли управляемый указатель наСтрока равна нулю, поэтому она генерирует одну инструкцию, которая проверяет, равен ли регистр нулю.
в int?codepath, вероятно, джиттер понимает, что тестирование int?для недействительности может быть достигнуто путем бокса INT?- так как заключенное в штучу null int является пустой ссылкой, то это сводится к более ранней проблеме проверки управляемого указателя на ноль.Но вы берете на себя стоимость бокса.
Если это так, то джиттер мог бы быть здесь более сложным и понимать, что тестирование int?для нуля может быть достигнуто путем возврата инверсии bool HasValue внутри int ?.
Но, как я уже сказал, это всего лишь предположение.Сгенерируйте код самостоятельно и посмотрите, что он делает, если вам интересно.