C#代码中的内嵌注释会影响编译后的dll吗?

问题描述 投票:0回答:2

考虑一个内容很少的 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!");
}
...
c# comments
2个回答
5
投票

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

也许吧。这里有一点微妙之处。

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

    无论如何都会有效果,因为来电者信息属性,如下面的代码所示: 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 不同,因为行号作为常量嵌入其中。

如果您担心评论会影响

性能

,那么您绝对不应该担心。但是,如果您真的担心仅通过进行通常不会影响行为的更改是否可以实现任何更改 - 是的,可能会发生微妙的变化。


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!"); }

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

© www.soinside.com 2019 - 2024. All rights reserved.