Какова цель «удалить неиспользуемые ссылки» - PullRequest
12 голосов
/ 07 марта 2009

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 08 марта 2009

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

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

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

12 голосов
/ 07 марта 2009

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

8 голосов
/ 07 марта 2009

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

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

7 голосов
/ 07 марта 2009

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

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

1 голос
/ 04 июня 2013

Reference Assistant для Visual Studio 2010 - лучший инструмент для удаления неиспользуемых ссылок в приложении.

http://visualstudiogallery.msdn.microsoft.com/fc504cc6-5808-4da8-ae86-8d3f9ed81606

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...