Почему вы должны удалить ненужные C # с помощью директив?

216

Например, мне редко нужно:

using System.Text;

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

Кроме того, имеет ли какое-либо значение, если одна и та же директива using используется только в одном файле против большинства / всех файлов?


Редактировать: Обратите внимание, что этот вопрос не о не связанной концепции, называемой оператором использования , предназначенной для того, чтобы помочь человеку управлять ресурсами, обеспечивая, чтобы при выходе объекта из области вызывался его метод IDisposable.Dispose . Смотрите Использование "использование" в C # .

steffenj
источник

Ответы:

181

Это ничего не изменит при запуске вашей программы. Все, что нужно, загружается по требованию. Таким образом, даже если у вас есть такой оператор using, если вы на самом деле не используете тип в этом пространстве имен / сборке, сборка, с которой используется оператор using, не будет загружена.

В основном, это просто для очистки по личным предпочтениям.

Даррен Копп
источник
@francip - это то, что я говорю. Использование не влияет на загрузку сборки, сборка не загружается до тех пор, пока не будет указан тип, содержащийся в сборке.
Даррен Копп
69
но это может повлиять на время компиляции и отзывчивость Intellisense / IDE.
2010 г.
475

Там являются несколько причин для удаления неиспользуемого использования (S) / пространств имен, кроме кодирования предпочтения:

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

Что удаление неиспользуемых пространств имен не будет делать:

  • каким-либо образом изменить вывод компилятора.
  • каким-либо образом изменить выполнение скомпилированной программы (более быстрая загрузка или лучшая производительность).

Получившаяся сборка является такой же, с неиспользованным использованием или без использования удаленных (-ых)

Поп-каталин
источник
3
И по мере изменения файлов вы в конечном итоге добавляете все больше и больше пространств имен в начало файлов. Поэтому, если вы не удаляете неиспользуемые пространства имен, при открытии файла все, что вы видите, - это огромный список пространств имен вместо реальной реализации.
Мерт Акчакая
5
Что касается более быстрой компиляции: неиспользуемые usingдирективы в .csфайлах могут помешать вам удалить некоторые (иначе неиспользуемые) ссылки на сборки из вашего .csprojпроекта. Если у вас есть «решение» для многих проектов, ненужные ссылки между проектами заставят проекты компилироваться в определенном порядке, когда на самом деле они независимы и могут быть скомпилированы параллельно. Поэтому удалите неиспользуемые usingдирективы, прежде чем проверять наличие неиспользуемых ссылок на проекты в решениях с несколькими проектами.
Джеппе Стиг Нильсен,
1
Это отличное объяснение - в конце концов, это не столько связано с производительностью, сколько с лучшими практиками. Спасибо за объяснение!
GSaunders
39

Чистота кода является важным.

Начинаешь складываться ощущение, что код может не поддерживаться и находиться на пути браузера, когда видишь лишнее использование. По сути, когда я вижу какие-то неиспользуемые операторы, в глубине моего мозга поднимается маленький желтый флажок, говорящий мне «действовать осторожно». И чтение производственного кода никогда не должно вызывать у вас такого чувства.

Так что приберись. Не будь неряшливым. Вдохновлять уверенность. Сделайте ваш код красивым. Дайте другому разработчику это теплое нечеткое чувство.

ядро
источник
Вот что я хотел услышать :-) Я привык делать Organize Usings -> Remove and Sortвремя от времени. Кстати, для меня два верхних варианта не Organize Usingsимеют смысла. Я говорю о VS2013, кстати.
Снаđошƒаӽ
30

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

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

Таким образом, единственный реальный отрицательный эффект наличия usingненужных операторов - это intellisense, так как список потенциальных совпадений для завершения при вводе увеличивается.

Франси Пенов
источник
4

Вы можете столкнуться с именами, если вы называете свои классы как (неиспользуемые) классы в пространстве имен. В случае System.Text у вас возникнет проблема, если вы определите класс с именем «Encoder».

В любом случае это обычно небольшая проблема, обнаруживаемая компилятором.

Пабло Фернандес
источник
2

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

mattlant
источник
2

В основном это личные предпочтения. Я убираю их сам (Resharper делает хорошую работу, сообщая мне, когда нет необходимости использовать операторы).

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

Джош скларе
источник
2

Оставлять дополнительные usingдирективы нормально. Их удаление мало, но не так много. Например, это делает мои списки заполнения IntelliSense короче, и, следовательно, легче ориентироваться.

Скомпилированные сборки не подвержены посторонним using директивы.

Иногда я кладу их внутрь #regionи оставляю свернутым; это делает просмотр файла немного чище. ИМО, это одно из немногих хороших применений #region.

Джей Базузи
источник
1
Их можно развалить без региона
абатищев
1
@abatishchev: Да, это правда в VS2010.
Джей Базузи
«Одно из немногих хороших применений #region», то есть вы имеете в виду, что использование #regionв большинстве случаев плохо?
Стивен
Да, #regionэто запах кода. Это говорит, что слишком много происходит в вашем классе.
Джей Базузи
2

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

Masd
источник
1

Они просто используются как ярлык. Например, вы должны будете писать: System.Int32 каждый раз, если у вас не было использования System; наверху.

Удаление неиспользуемых просто делает ваш код более чистым.

Карра
источник
1

Оператор using не позволяет вам квалифицировать используемые вами типы. Мне лично нравится убирать их. На самом деле это зависит от того, как используется метрика loc

CheeZe5
источник
1

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

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

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

Сейчас я работаю над очисткой пространств имен, потому что меня постоянно спрашивают, какие части приложения так или иначе обращаются к одним и тем же данным.

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

Я не могу придумать более простой способ сделать это все сразу.

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

Тимоти Гонсалес
источник
0

Оператор «using» не влияет на производительность, поскольку он является просто помощником в определении имен ваших идентификаторов. Поэтому вместо того, чтобы вводить System.IO.Path.Combine (...) , вы можете просто ввести Path.Combine (...), если вы используете System.IO .

Джордан Пармер
источник
0

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

Патрик Дежарден
источник