Зачем удалять неиспользуемые директивы using в C#?


Мне интересно, есть ли какие-либо причины (кроме очистки исходного кода), почему разработчики используют "удалить неиспользуемые Usings" функция в Visual Studio 2008?

10 106

10 ответов:

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

  • это бессмысленно. Они не добавляют никакой ценности.
  • Это сбивает с толку. Что используется из этого пространства?
  • если вы этого не сделаете, то постепенно будете накапливать бессмысленное using заявления, как ваш код меняется с течением времени.
  • статический анализ выполняется медленнее.
  • компиляция кода происходит медленнее.

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

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

представьте, что вы должны вернуться на свой код в 3, 6, 9 месяцев - или кто-то другой должен взять на себя ваш код и сохранить его.

Если у вас есть огромный длинный список использования инструкции, которые на самом деле не нужны, глядя на код может быть довольно запутанным. Почему это используется там, если ничего не используется из этого пространства имен??

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

Марк

Мне кажется, что это очень разумный вопрос,который рассматривается довольно легкомысленно людьми, отвечающими.

Я бы сказал, что любое изменение исходного кода должно быть оправдано. Эти изменения могут иметь скрытые издержки, и человек, задающий вопрос, хотел бы знать об этом. Они не просили называть их "ленивыми", как это делал один человек.

Я только начал использовать Resharper, и он начинает давать предупреждения и подсказки стиля на проект, за который я отвечаю. Среди них-удаление избыточной директивы using, а также избыточных квалификаторов, капитализации и многое другое. Мой внутренний инстинкт заключается в том, чтобы привести в порядок код и разрешить все намеки, но моя деловая голова предупреждает меня о необоснованных изменениях.

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

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

Если я посмотрю на правильное использование капитализации анахронимов (т. е. ABCD -> Abcd), то я должен учитывать, что Resharper не рефакторирует ни один из Xml-файлов, которые мы используем для имен ссылочных классов.

Так, следование этим намекам не так прямолинейно, как кажется, и к ним следует относиться с уважением.

меньше параметров во всплывающем окне Intellisense (особенно если пространства имен содержат множество методов расширения).

теоретически Intellisense тоже должен быть быстрее.

В дополнение к уже указанным причинам, он предотвращает ненужные конфликты имен. Рассмотрим этот файл:

using System.IO;
using System.Windows.Shapes;

namespace LicenseTester
{
    public static class Example
    {
        private static string temporaryPath = Path.GetTempFileName();
    }
}

этот код не компилируется, потому что оба пространства имен System.IO и система.Окна.Каждая фигура содержит класс Path. Мы могли бы исправить это, используя полный путь к классу,

        private static string temporaryPath = System.IO.Path.GetTempFileName();

или мы могли бы просто удалить строку using System.Windows.Shapes;.

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

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

код компилируется быстрее.

по крайней мере в теории, если вам дали C# .cs-файл (или любой отдельный файл исходного кода программы), вы должны иметь возможность посмотреть на код и создать среду, которая имитирует все, что ему нужно. С помощью некоторых методов компиляции / синтаксического анализа вы даже можете создать инструмент, чтобы сделать это автоматически. Если это сделано вами, по крайней мере, в виду, вы можете убедиться, что вы понимаете все, что говорит файл кода.

Теперь рассмотрим ,если вам дали.cs файл с 1000 using директивы, которые только 10 был фактически использован. Когда вы смотрите на символ, который недавно ввел в код, который ссылается на внешний мир, вам придется пройти через эти 1000 строк, чтобы выяснить, что это такое. Это явно замедляет описанную выше процедуру. Так что если вы можете уменьшить их до 10, это поможет!

по-моему, C# using директива очень слаба, так как вы не можете указать один общий символ без потери универсальности, и вы не можете использовать using директива alias для использования метод расширения. Это не относится к другим языкам, таким как Java, Python и Haskell, на этих языках вы можете указать (почти) точно, что вы хотите от внешнего мира. Но событие тогда, я предложу использовать using псевдоним, когда это возможно.

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

представьте, что у вас есть две сборки, где одна ссылается на другую (теперь давайте назовем первую A и ссылки B). Теперь, когда у вас есть код в A, который зависит от B, все в порядке. Однако на каком-то этапе вашего процесса разработки вы замечаете, что на самом деле вам больше не нужен этот код, но вы оставляете using-оператор там, где он был. Теперь у вас не только есть бессмысленный using-директива, но и сборка-ссылка до B, который не используется нигде, кроме как в устаревшие директивы. Это во-первых увеличивает количество времени, необходимого для компиляции A, а B также должен быть загружен.

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

наконец, в нашем exapmle мы должны были отправить B и A вместе, хотя B не используется нигде в A, но в using-раздел. Это будет массово влиять на runtimeисполнение A, когда загрузка сборка.