网上有很多文章列出了 C# JIT 在执行一段代码之前所做的优化。例如,MSDN 上的这篇文章谈到:
常量折叠、常量和复制传播、公共子表达式消除、循环不变量的代码运动、死存储和死代码消除、寄存器分配、方法内联、循环展开(带有小主体的小循环)。
我的问题是:JIT 编译器是否也处理无用的空检查?我找不到任何处理这个问题的来源。
在同一篇文章中,我读到:
由于 C# 语言规范确保对空对象引用的任何调用都会引发 NullReferenceException,因此每个调用站点都必须确保实例不为空。这是通过取消引用实例引用来完成的;如果它为空,它将生成一个错误,该错误会变成此异常。
所以,假设我写了一段这样的代码:
if (person != null)
{
Console.WriteLine(person.Name);
}
再次调用第二person.Name
次空检查,这显然是无用的,编译器可以将其删除。或不?
我读到在 Java 中这已经完成(这里、这里和这里的许多来源之间的一些来源)。
如果 C# 也这样做,您是否知道一些关于此的源或文档?
如果相反,C# 不这样做,你知道为什么吗?在 Java JIT 没有遇到的 .NET 环境中实现这样的功能是否存在内在困难?