我知道CLR会优化一些代码,但我不知道它们是什么,就像下面的代码:
class Program
{
static void Main(string[] args)
{
try
{
Program p = new Program();
string another = "a";
var no = p.SNo;
var field = p.FieldA;
string name = "stackoverflow" + p.Name;
var a = p.Name;
}
catch (Exception ex)
{
Console.WriteLine("yes, clr runs it");
}
Console.WriteLine("over");
}
public string FieldA;
public string Name
{
get
{
return GetName();
}
}
public string SNo
{
get;
set;
}
public string GetName()
{
throw new Exception("can you run at here?");
}
}
环境:.NET 4.0 + VS2015 + Win7x64调试模式下的输出(运行string another = "a";
):
是的,CLR 运行它
多
在发布模式下输出(与调试模式相同),并且具有"优化代码"标志:
是的,CLR 运行它
多
然后我在 dll 中找到代码:
private static void Main(string[] args)
{
try
{
Program program = new Program();
string sNo = program.SNo;
string fieldA = program.FieldA;
string text3 = "stackoverflow" + program.Name;
string name = program.Name;
}
catch (Exception)
{
Console.WriteLine("yes, clr runs it");
}
Console.WriteLine("over");
}
string another = "a";
已经消失了,但财产program.SNo
和田野program.FieldA
以及未使用的text3
都在那里。
那么,clr
做了什么?当它成为在IIS中运行的 aps.net 应用程序时,它会有所不同吗? IIS 做了什么吗?
删除死代码(包括未使用的变量)是任何编译器所做的最基本的优化之一。代码分析为此发出警告:CA1804:删除未使用的局部变量,它非常明确地指出:
请注意,启用优化选项时,C# 编译器 [...] 会删除未使用的局部变量。