Остановить Visual Studio от размещения директив using вне пространства имен

Есть ли в Visual Studio (или ReSharper) параметр, позволяющий указать, какие пространства имен должны быть по умолчанию и в какую область они помещены?

Например, значение по умолчанию для проекта MVC:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Namespace
{
    public class Class1
    {
    }
}

но ReSharper и StyleCop жалуются:

Все директивы using должны быть размещены внутри пространства имен. [Правило StyleCop: SA1200]
Директива Using не требуется кодом и может быть безопасно удалена.

Есть ли способ просто сделать значение по умолчанию:

namespace Namespace
{
    public class Class1
    {
    }
}

person dav_i    schedule 29.10.2014    source источник
comment
Да, вы можете редактировать шаблон класса; stackoverflow.com/questions/2072687/   -  person Alex K.    schedule 29.10.2014
comment
@AlexK. Спасибо. Проголосовал за то, чтобы закрыть это как обман :)   -  person dav_i    schedule 29.10.2014
comment
@dav_i: Ответ может быть дублированным, но я предполагаю, что вы не знали, что шаблоны существуют? Так что, возможно, стоит оставить вопрос, исходя из этого факта.   -  person Ian    schedule 29.10.2014
comment
Согласованный. И спасибо за ответ! Если закрыть его как обман, вопрос остается в силе, так что люди все еще могут пойти Google>This Q>That Q.   -  person dav_i    schedule 29.10.2014
comment
@dav_i - хороший момент :)   -  person Ian    schedule 29.10.2014
comment
Мне было интересно прочитать о правиле StyleCop, поскольку я привык видеть использование директив вне пространств имен (Newtonsoft.Json, NodaTime, MiscUtil Джона Скита), и я нашел эти вопросы, которые могут заинтересовать других читателей: stackoverflow.com/q/125319/397817 stackoverflow.com/q/1071797/397817   -  person Stephen Kennedy    schedule 29.10.2014


Ответы (6)


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

Если вы это сделаете, все шаблоны файлов будут доступны и их можно будет редактировать. См. Ответ Как мне редактировать шаблоны Visual Studio для нового класса / интерфейса C #?, чтобы указать, где они находятся в каждой версии Visual Studio.

Когда вы окажетесь там, вы можете изменить макет, например, базовый класс будет выглядеть так:

using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;
$if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks;
$endif$
namespace $rootnamespace$
{
    class $safeitemrootname$
    {
    }
}

Вы можете изменить это на следующее или подобное:

namespace $rootnamespace$
{
    using System;
    using System.Collections.Generic;
    $if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
    $endif$using System.Text;
    $if$ ($targetframeworkversion$ >= 4.5)using System.Threading.Tasks;
    $endif$

    class $safeitemrootname$
    {
    }
}

Однако может потребоваться изменить довольно много файлов!

person Ian    schedule 29.10.2014
comment
Обычно я не верю, что включение операторов using в начало вашего класса может причинить вред. - Компилятор будет искать директивы, начиная с внутреннего пространства имен, и, если они не найдены, продолжит поиск директив вне пространства имен. Итак - если вы поместите директивы вне пространства имен, и я создам класс с тем же именем внутри пространства имен - тогда будет использоваться мой класс. Размещение директив внутри пространства имен - очень небольшое усилие для добавления большей безопасности в ваш код. - person Fabio; 04.07.2017
comment
В дополнение к замечанию Фабио, область видимости просто другая, поэтому размещение директивы using внутри или вне пространства имен является различием и может привести к проблемам. - person Steef; 19.03.2021

Вы можете установить это в Re-Sharper.

Re-sharper> Параметры> C #> Импорт пространства имен> Добавить директиву using в самую глубокую область видимости.


Обновление. Начиная с VS2015 и Resharper10, это перемещено. Сейчас он находится под:

Редактирование кода> C #> Стиль кода> Справочная квалификация> Добавить директиву using в самую глубокую область видимости

person Adam_Dev    schedule 29.10.2014
comment
Привет, спасибо за ответ. Этот параметр работает только при добавлении пространств имен. Не создавать новые файлы. - person dav_i; 29.10.2014
comment
Вы можете использовать шаблоны, как предложено выше, см. stackoverflow.com/questions/2072687/ - person Adam_Dev; 29.10.2014
comment
Сброс этого флага работает для ReSharper8.2 и VS2013. Наоборот. - person Lin Song Yang; 04.06.2015
comment
В VS2015 и Resharper10 этот раздел пуст и настраивать его негде. - person Neutrino; 15.03.2016
comment
@Neutrino Я больше не могу этого найти. Вы когда-нибудь сталкивались с этим в августе? Resharper больше не запрашивает перемещение использования внутри пространства имен и, следовательно, не имеет для этого комбинации alt + enter. - person JARRRRG; 01.09.2016
comment
Теперь он находится в разделе «Редактирование кода» ›C #› Стиль кода ›Ссылочная квалификация› Добавить директиву using в самую глубокую область видимости. - person TrueWill; 11.10.2016
comment
Снова перемещено в resharper: теперь оно находится в разделе «Редактирование кода» ›C #› Стиль синтаксиса ›Добавить директиву using в самую глубокую область видимости. - person ozba; 01.10.2020

В настоящее время есть более простой способ сделать это без изменения шаблонов и без ReSharper. С тех пор, как было выпущено обновление 16.1 для Visual Studio 2019, вы можете настроить использование внутри пространства имен, выполнив следующие действия:

  1. Откройте Visual Studio.
  2. На панели инструментов выберите Инструменты.
  3. В меню "Инструменты" откройте Параметры.
  4. В списке параметров выберите Текстовый редактор ›C #› Стиль кода ›Общие.
  5. Прокрутите вниз в самом низу, найдите раздел настройки использования и установите Предпочтительное размещение директивы using на Внутри пространства имен

введите описание изображения здесь

person msmolcic    schedule 23.03.2021

В ReSharper 2020 он находится в разделе «Редактирование кода» ›C #› Стиль синтаксиса ›Добавить директиву using в самую глубокую область видимости.

person ozba    schedule 01.10.2020

Также существует расширение Visual Studio для VS 2015 и 2017, которое фиксирует using объявления постфактум. Он также имеет некоторые параметры конфигурации для группировки определенных объявлений (например, System.*)

https://marketplace.visualstudio.com/items?itemName=everfor88.UsingDirectiveFormatter

введите описание изображения здесь

person Cristian Diaconescu    schedule 18.03.2019

Используя .editorConfig, вы можете добавить следующее.

# 'using' directive preferences
csharp_using_directive_placement =inside_namespace:warning
person Xavier John    schedule 11.06.2021