如果C#dll中的代码正在运行?

时间:2016-07-06 07:58:55

标签: c# optimization reflection clr difference

我知道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有没有做过什么?

1 个答案:

答案 0 :(得分:1)

删除死代码(包括未使用的变量)是任何编译器最基本的优化之一。代码分析会对此提出警告:CA1804: Remove unused locals并且它非常明确地声明:

  

请注意,启用优化选项后,C#编译器[...] 会删除未使用的局部变量