考虑一个内容很少的 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!");
}
...
这是否意味着两个 dll 完全相同?
也许吧。这里有一点微妙之处。
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);
}
}
如果您担心评论会影响
性能,那么您绝对不应该担心。但是,如果您真的担心仅通过进行通常不会影响行为的更改是否可以实现任何更改 - 是的,可能会发生微妙的变化。
为您检查了这一点(尽管我已经知道注释不会影响生成的 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!");
}
这是因为编译器通常会忽略注释,除非它们是文档注释或者您正在生成需要行号才能正常工作的调试符号。