В Интернете есть много статей, в которых перечислены оптимизации, сделанные C# JIT перед выполнением фрагмента кода. Например, в этом сообщении на MSDN говорится о:
Сворачивание констант, Распространение констант и копий, Устранение общих подвыражений, Перемещение кода инвариантов цикла, Мертвое хранилище и устранение мертвого кода, Распределение регистров, Встраивание методов, Развертывание циклов (небольшие циклы с небольшими телами).
Мой вопрос: компилятор JIT также имеет дело с бесполезными нулевыми проверками? Я не могу найти источник, рассматривающий этот вопрос.
В той же статье я прочитал:
поскольку спецификация языка C# гарантирует, что любой вызов нулевой ссылки на объект вызывает исключение NullReferenceException, каждый сайт вызова должен гарантировать, что экземпляр не является нулевым. Это делается путем разыменования ссылки на экземпляр; если он равен нулю, он сгенерирует ошибку, которая превратится в это исключение.
Итак, предположим, я пишу такой фрагмент кода:
if (person != null)
{
Console.WriteLine(person.Name);
}
person.Name
снова вызывает вторую нулевую проверку, которая явно бесполезна, и компилятор может ее удалить. Или не?
Я читал, что в Java это уже сделано (некоторые источники между многими здесь, здесь и здесь).
Если это делает и C#, знаете ли вы какой-нибудь источник или документацию, в которой говорится об этом?
Если вместо этого C# этого не делает, знаете почему? Есть ли внутренняя трудность в реализации такой функции для среды .NET, с которой Java JIT не сталкивается?
?.
). - person Hans Passant   schedule 07.12.2016