考虑一个内容很少的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!");
}
...
答案 0 :(得分:5)
这是否意味着两个dll完全相同?
也许。这里有点微妙。
deterministic
不是默认由于来电者信息属性,行号 无论如何都会产生影响,如下面的代码所示:
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!");
}
这是因为编译器通常会忽略注释,除非它们是文档注释或者您生成的调试符号需要行号才能正常工作。