Влияют ли встроенные комментарии в C # код на скомпилированную dll? - PullRequest
0 голосов
/ 21 мая 2018

Рассмотрим файл 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 голосов
/ 21 мая 2018

Значит ли это, что оба dll полностью идентичны?

Может быть.Здесь есть немного тонкости.

  • По умолчанию компилятор C # не детерминирован .То есть даже при одинаковом вводе вы можете получить разные DLL из-за генерируемых идентификаторов.Я знаю, что был сделан шаг к тому, чтобы сделать детерминированный режим стандартным для проектов .NET Core SDK, но я не уверен, что это произошло.Из командной строки, просто запустив csc с Roslyn 2.8.0.62830, 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 отличается, так как номер строки вставлен туда как константа.

Если вы беспокоитесь о комментариях, влияющих на производительность , вам определенно не следует.Но если вы действительно обеспокоены тем, возможно ли любое изменение, просто внося изменения, которые обычно не влияют на поведение - да, могут быть тонкие изменения.

0 голосов
/ 21 мая 2018

Я использовал 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!");
}

Это потому, что компиляторы в общем игнорируют комментарии, если они не являются комментариями к документации или вы генерируете символы отладки, для работы которых требуются номера строк.

...