C#代码中的内嵌注释是否会影响已编译的dll?

时间:2018-05-21 13:58:03

标签: c# compiler-construction comments

考虑一个内容很少的C#文件,例如

...
public void DoSomething()
{
    Console.WriteLine("Does Something!");
}
...

相同的片段中有评论:

...
public void DoSomething()
{
    // This line does something!
    Console.WriteLine("Does Something!");
}
...

当编译器出现将此文件放入dll时,它将删除多余的并使其机器可读。这是否意味着两个dll都完全相同?这两个文件显然有不同的行数,并且会散列到不同的值,但编译器是否关心?空白行是否会对更改文件产生相同的影响,例如

...
public void DoSomething()
{

    Console.WriteLine("Does Something!");
}
...

2 个答案:

答案 0 :(得分:5)

  

这是否意味着两个dll完全相同?

也许。这里有点微妙。

  • 默认情况下,C#编译器不是 deterministic 。也就是说,即使输入完全相同,也可能因生成ID而获得不同的DLL。我知道有一种推动将确定性模式作为.NET Core SDK项目的默认模式,但我不确定是否发生了这种情况。从命令行,只运行带有Roslyn 2.8.0.62830的csc,deterministic 不是默认
  • 行号通常不会影响IL,但它们会影响正在生成的任何PDB文件,因此调试器知道源代码中的哪一行与IL对应。即使没有行号更改,PDB文件也包含源代码的哈希值,以便调试器可以检查它是否正在查看“正确”的代码。
  • 由于来电者信息属性,行号 无论如何都会产生影响,如下面的代码所示:

    using System;
    using System.Runtime.CompilerServices;
    
    class Program
    {
        public static void Main()        
        {
            // Remove this comment and get a different result
            PrintLine();
        }
    
        static void PrintLine([CallerLineNumber] int line = 0)
        {
            Console.WriteLine(line);
        }
    }
    

根据那里的评论,这打印9.没有评论,它打印8. IL是不同的,因为行号作为常量嵌入那里。

如果您担心影响效果的评论,您绝对不应该这样做。但是,如果您真的很担心是否可以通过进行通常不会影响行为的更改来实现任何更改 - 是的,可能会有微妙的变化。

答案 1 :(得分:2)

我使用SharpLab为您检查(尽管我已经知道注释不会影响生成的IL)。

public void Main()
{
    // Useful comment
    Console.WriteLine("Hello world!");
}

public void Main()
{
    /* Useful comment */ Console.WriteLine("Hello world!");
}

编译到

public void Main()
{
    Console.WriteLine("Hello world!");
}

这是因为编译器通常会忽略注释,除非它们是文档注释或者您生成的调试符号需要行号才能正常工作。