我知道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运行它
在
在发布模式下输出(与调试模式相同),并且它具有'Optimize code'标志:
是的,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有没有做过什么?
答案 0 :(得分:1)
删除死代码(包括未使用的变量)是任何编译器最基本的优化之一。代码分析会对此提出警告:CA1804: Remove unused locals并且它非常明确地声明:
请注意,启用优化选项后,C#编译器[...] 会删除未使用的局部变量。