Подтвердить что ты не робот

Какова цель "удалить неиспользуемые ссылки"

Я читал, что удаление неиспользуемых ссылок не имеет значения для компилятора, поскольку он игнорирует сборки, на которые не ссылаются сам код.

Но мне трудно поверить, потому что тогда, какова реальная цель Удаление неиспользуемых ссылок? Он не оказывает заметного влияния на размер сгенерированной сборки или иным образом. Или это умное поведение ограничено компилятором С# (csc.exe) и не присущим vbc.exe?

Если эта функциональность настолько бесполезна, почему ReSharper предлагает ее как функцию? Почему это предусмотрено в диалоговом окне "Конфигурация проекта Visual Studio"?

Единственное действие, которое я могу придумать, где это было бы полезно, - это во время развертывания. Ссылки (используемые или неиспользуемые) все равно будут скопированы установщиком. Но для сборок, которые находятся в GAC (например, сборки BCL), это тоже не проблема.

4b9b3361

Ответ 1

Он не позволяет CLR загружать указанный модуль во время выполнения. Это сократит время запуска (поскольку для загрузки каждого модуля требуется время). В зависимости от размера модуля он может заметно уменьшить время запуска.

Один из способов проверить это - создать тестовый проект WinForms, добавить ссылку на сборку, которая не используется (например, System.Web), затем запустить и прикрепить к исполняемому файлу (например, F5). Просмотрите загруженные модули (Debug → Windows → Modules), и вы увидите, что загруженная ссылка была загружена.

Если вы думаете об этом, CLR будет довольно сложно определить, действительно ли используется зависимость (она в манифесте как зависимость после добавления ссылки на нее)... Тем более, что выполнение некоторых путей кода не может быть заранее известна...

Ответ 2

Помимо исходных файлов, которые меньше, я думаю, что лучше иметь чистый исходный файл, который не имеет неиспользуемого кода или ссылок.

Ответ 3

Visual Studio 2008 также имеет функцию удаления неиспользуемых директив.

Удаление неиспользуемого кода делает код более аккуратным, но вы также можете уменьшить риск конфликтов. Иногда в разных сборках есть классы с одинаковым именем. Например, существует класс Image как в System.Drawing, так и System.Web.UI.WebControls. Если вы используете директивы для обоих пространств имен и начинаете использовать класс Image, компилятор не может определить, какие из них использовать.

Ответ 4

Это оптимизация, чтобы сделать ваш проект более быстрым. Это позволяет избежать метаданных загрузки компилятора, которые никогда не будут использоваться. Это второстепенное, хотя, я думаю, около 50 мс, в зависимости от скорости вашего жесткого диска и состояния кеша файловой системы.

Компилятор С# достаточно умен, чтобы выпустить только ссылки на сборку в метаданных вашей сборной сборки для фактически используемых сборок. Таким образом, вы не будете генерировать собственные изображения для сборок, которые вы не используете при запуске Ngen.exe. Компилятор JIT не будет затронут в любом случае, он загружает сборки только по мере необходимости, чтобы перевести IL.