2009-04-27 2 views

ответ

14

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

+0

На самом деле, я, кажется, помню, что там * может * быть разницей ... * если * есть конфликтующие типы и т. Д. На разных уровнях. –

+0

И как еще одна (более практичная) разница ... один из них может привести к сбою генератора кода LINQ-to-SQL, а другой нет ;-p –

+0

Хорошая точка Marc, будет редактировать. –

7

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

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

См. the related StyleCop documentation для более полного обсуждения.

+0

+1. Интересный краевой кейс. –

Смежные вопросы