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



我知道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# 编译器 [...] 会删除未使用的局部变量

相关内容

  • 没有找到相关文章

最新更新