Пространства имен и использование директив

Если у меня есть пространство имен, например:

namespace MyApp.Providers
 {
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Globalization;
  }

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

Если да, то не является ли это головной болью руководства?


person JL.    schedule 20.07.2009    source источник
comment
Подробнее здесь: stackoverflow.com/questions/125319/   -  person alexandrul    schedule 05.04.2011
comment
Это директива, а не заявление. usingУтверждение — это совсем другое.   -  person Ben Voigt    schedule 27.03.2012


Ответы (6)


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

Если вы поместите оператор using вне пространства имен, то он будет применяться ко всему файлу независимо от пространства имен.

Он также будет сначала искать Использование внутри пространства имен, прежде чем перейти к внешней области.

person Brandon    schedule 20.07.2009
comment
Как поместить оператор using вне файла? - person Fredrik Mörk; 21.07.2009
comment
Извините, опечатка. Имелось в виду вне пространства имен. - person Brandon; 21.07.2009

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

Ссылка:

Область применения директивы using ограничена файлом, в котором она появляется.

person tvanfosson    schedule 20.07.2009

Нет, это не так, и поэтому нет, это не так.

Учтите тот факт, что за пределами объявления namespace вы находитесь в глобальном пространстве имен. Влияют ли операторы using в этой области исходного файла на глобальное пространство имен в других исходных файлах?

person Daniel Earwicker    schedule 20.07.2009

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

Одно примечание: вы делаете очень хорошую практику, помещая операторы использования внутри пространства имен. Это очень хороший синтаксис.

Продолжайте хорошую работу.

person Keith Adler    schedule 20.07.2009
comment
Почему полезно помещать операторы Using в объявление пространства имен? - person Colin Mackay; 21.07.2009
comment
Интересно, почему вы считаете это очень хорошей практикой? Если вы следуете хорошей практике размещения каждого класса в отдельном файле, не имеет большого значения, помещаете ли вы операторы using в начало файла или в начало блока namespace. - person Daniel Earwicker; 21.07.2009
comment
Сережа - ОГРОМНОЕ СПАСИБО!!! вот почему я запутался в первую очередь! - person JL.; 21.07.2009
comment
И StyleCop рекомендует вам помещать операторы использования в пространство имен, но да, вряд ли это что-то изменит? - person JL.; 21.07.2009
comment
На самом деле это не ответ на вопрос, почему это хорошая практика, но более подробное обсуждение этого вопроса: stackoverflow.com/questions/125319/ - person Ray; 21.07.2009
comment
Вот моя статья, в которой обсуждаются некоторые тонкости внутреннего и внешнего blogs.msdn.com/ericlippert/archive/2007/06/25/ - person Eric Lippert; 21.07.2009
comment
Вот ответ на вопрос, почему это хорошая практика: blogs.msdn.com/ericlippert/archive/2007/06/25/ Кроме того, если вы работаете в MS или используете StyleCop, это подтолкнет вас к этому формату. - person Keith Adler; 21.07.2009
comment
Извините, хотел включить ссылку выше. - person Keith Adler; 21.07.2009

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

person Fredrik Mörk    schedule 20.07.2009

Использование применяется только к текущему файлу. Находятся ли они внутри или вне объявления пространства имен, не имеет большого значения:

Порядок поиска типов следующий:

  1. начать с самой внутренней декларации пространства имен
  2. смотреть в текущем пространстве имен
  3. посмотрите в использовании текущего пространства имен
  4. перейти к объявлению родительского пространства имен и повторить с шага 2

В результате эта программа скомпилируется нормально:

namespace MyProject.Main {
    using System;

    class Program {
        public static void Main(string[] args) {
            Console.WriteLine("Hello, World!");
        }
    }
}

// in another file:
namespace MyProject.Console {
    class Test {}
}

Но если вы переместите using System; наверх, компиляция завершится ошибкой (MyProject.Console.WriteLine не существует).

person Daniel    schedule 20.07.2009