Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C代码中的内嵌注释是否会影响已编译的dll?_C#_Compiler Construction_Comments - Fatal编程技术网

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

C# C代码中的内嵌注释是否会影响已编译的dll?,c#,compiler-construction,comments,C#,Compiler Construction,Comments,考虑一个内容很少的C文件,例如 ... public void DoSomething() { Console.WriteLine("Does Something!"); } ... 同一个片段中有注释: ... public void DoSomething() { // This line does something! Console.WriteLine("Does Something!"); } ... 当编译器将此文件放入dll中时,它将去除多余的内容,使其

考虑一个内容很少的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!");
}
...
虽然我已经知道评论不会影响生成的IL,但我曾经为您检查过这一点

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

两者都编译为

public void Main()
{
    Console.WriteLine("Hello world!");
}
这是因为编译器通常会忽略注释,除非它们是文档注释,或者您正在生成需要行号才能正常工作的调试符号。

我曾经为您检查过这一点,尽管我已经知道注释不会影响生成的IL

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

两者都编译为

public void Main()
{
    Console.WriteLine("Hello world!");
}
这是因为编译器通常会忽略注释,除非它们是文档注释,或者您正在生成需要行号才能正常工作的调试符号

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

也许吧。这里有点微妙

默认情况下,C编译器不是确定性的。也就是说,即使使用完全相同的输入,由于生成的ID,也可能会得到不同的DLL。我知道有人推动将确定性模式作为.NET核心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是不同的,因为行号作为常量嵌入其中

如果您担心影响性能的评论,您绝对不应该这样做。但是,如果你真的担心仅仅通过做出通常不会影响行为的改变是否有可能做出任何改变——是的,可能会有细微的改变

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

也许吧。这里有点微妙

默认情况下,C编译器不是确定性的。也就是说,即使使用完全相同的输入,由于生成的ID,也可能会得到不同的DLL。我知道有人推动将确定性模式作为.NET核心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是不同的,因为行号作为常量嵌入其中


如果您担心影响性能的评论,您绝对不应该这样做。但是,如果你真的担心仅仅通过做出通常不会影响行为的改变是否有可能做出任何改变-是的,可能会有细微的改变。

不好笑,但你可以自己做并测试,在发布问题的时间内已经有了答案。当你编译这三个程序时,发生了什么?他们是不同的,还是没有?看看IL,看看你自己。我们为什么要为你这样做呢?让我们来。删除评论;要讨论自己测试的其他评论有多好或有多大帮助,请以链接的形式加入聊天。不好笑,但你可以自己做并测试,并且在发布问题的时间内已经有了答案。当你编译这三个程序时,发生了什么?他们是不同的,还是没有?看看IL,看看你自己。我们为什么要为你这样做呢?让我们来。删除评论;要讨论TestIt自己的其他评论有多好或有多大帮助,请以链接方式加入聊天。不影响IL与生成相同的DLL不同。编译器可以根据所有源代码的哈希值决定生成ID;它不会出现在用于反编译的文本IL中,但仍然是相关的。还请根据我的回答注意呼叫者信息属性。@DaisyShipto
n据我所知,.dll格式还包括一个时间戳。因此,除非这些文件是同时编译的,否则它们无论如何都是不同的。我的观点是,OP询问DLL是否完全相同-您的回答并没有真正解决这个问题。@DaisyShipton因为windows下的可执行文件从来都不相同,因为图像文件头中有一个时间戳,我有点忽略了这一点。您的答案似乎更适合解决这个问题。不影响IL与生成相同的DLL不同。编译器可以根据所有源代码的哈希值决定生成ID;它不会出现在用于反编译的文本IL中,但仍然是相关的。另请根据我的回答注意调用方信息属性。@DaisyShipton据我所知,.dll格式还包括时间戳。因此,除非这些文件是同时编译的,否则它们无论如何都是不同的。我的观点是,OP询问DLL是否完全相同-您的回答并没有真正解决这个问题。@DaisyShipton因为windows下的可执行文件从来都不相同,因为图像文件头中有一个时间戳,我有点忽略了这一点。你的回答似乎更适合解决这个问题。