2016-06-03 4 views
-4

Я нашел кое-что, что заставило меня задуматься.Пространство имен и сборка

Я добавил using System.Windows; к моему .cs файл, потому что я хотел ту использовать

DependencyObject foo 

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

System.Windows.DependencyObject foo 

Чтобы сделать первый код работы я имел добавить сборку в мой проект.

Итак, почему у нас есть using, если нам нужно добавить сборку для проекта? Я имею в виду, каков механизм этого?

+1

Директива * using * просто полезна, чтобы избежать необходимости вводить полное имя типа в исходный код. И применяется только к имени пространства имен, а не к имени сборки. Вы не можете использовать то, что вы не ссылаетесь, вы должны сообщить компилятору, откуда он пришел. VS2015 облегчает работу с лампочкой. –

ответ

1

Using не добавляет Ассамблей для вас. И вы можете использовать только сборки, на которые ссылается ваш проект.

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

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

+0

Да, я вижу это ... Спасибо :) –

0

Есть разница между этими двумя. Представьте, что вы есть следующий код в File1.cs:

// File1.cs 
using System; 
namespace Outer.Inner 
{ 
    class Foo 
    { 
     static void Bar() 
     { 
      double d = Math.PI; 
     } 
    } 
} 

Теперь представьте, что кто-то добавляет другой файл (File2.cs) в проект, который выглядит следующим образом:

// File2.cs 
namespace Outer 
{ 
    class Math 
    { 
    } 
} 

компилятор ищет Outer, прежде чем смотреть на тех, кто использует заявления за пределами пространство имен, поэтому оно находит Outer.Math вместо System.Math. К сожалению (или, возможно, к счастью?), Outer.Math не имеет члена PI, поэтому File1 теперь сломан.

Это меняется, если вы поместите используя внутри объявления пространства имен, а именно:

// File1b.cs 
namespace Outer.Inner 
{ 
    using System; 
    class Foo 
    { 
     static void Bar() 
     { 
      double d = Math.PI; 
     } 
    } 
} 

теперь поиски компилятора системы перед поиском Outer, находит System.Math, и все хорошо.

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

Также интересно отметить, что произойдет, если Foo находится в пространстве имен Outer, а не Outer.Inner. В этом случае добавление Outer.Math в File2 прерывает File1 независимо от того, куда идет использование. Это означает, что компилятор просматривает самое внутреннее пространство имен, перед тем как он смотрит на любые используемые операторы.

1

Вы должны добавить сборку, чтобы иметь возможность использовать классы внутри этой сборки. Когда вы добавите сборку в свой проект, если вы не добавите оператор using, вы всегда должны ссылаться на класс в этой сборке, используя полное имя, например. System.Windows.DependencyObject. После добавления инструкции using вы можете обратиться к классу, используя только его имя класса, например. DependencyObject. Другими словами, оператор using просто предназначен для предоставления более короткого способа обращения к классу.

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