Пространства имен .NET и использование операторов

Возможный дубликат:
Если использование должно находиться внутри или вне пространства имен

В чем разница между

namespace x
{
  using y;
}

и

using y;
namespace x
{
}

?

Ответы

Ответ 1

Первый имеет y в области только для пространства имен x, второй имеет y в объеме для всего файла, поэтому потенциально другие пространства имен. Если вы придерживаетесь одного пространства имен для каждого файла (я бы предположил, что это было соглашение), то обычно нет никакой реальной разницы [но см. Комментарий Марка о столкновениях, если разные типы имеют одинаковое имя в разных пространствах имен]. Если вы используете StyleCop, он захочет, чтобы вы сохранили имена внутри пространства имен.

Ответ 2

Помещение оператора using внутри блока namespace позволяет привязать его к этому блоку. Это влияет на ряд вещей.

  •  
  • Как упоминалось @Steve Haigh, оператор using действителен только в блоке, поэтому, если бы были другие блоки namespace, они не были бы пострадавших.  
  • Пространство имен, указанное using, может быть сокращено на основе внешнего блока namespace. Таким образом, using x.y; вне пространства имен может быть просто выражено как using y; внутри блока namespace x.  
  • Помещение using внутри пространства имен заставляет компилятор гарантировать, что указанное пространство имен не будет перезаписано. Например:
        using Guid = System.Guid;
        namespace Sample
        {
            public class Guid {}
            public class Program
            {
                public static void Main()
                {
                    Console.WriteLine(new Guid());
                }
            }
        }
    Вышеприведенный код будет компилироваться, но неясно, какой экземпляр Guid создается. Однако если оператор using находится внутри блока namespace, то возникает ошибка компилятора.

См. соответствующую документацию по StyleCop для более полного обсуждения.