Импортирование вложенных пространств имен автоматически в С#
Извините, если этот вопрос уже задан.
Я начал изучать С# и заметил, что С# автоматически не импортирует вложенные пространства имен.
Я не понимаю:
using System;
должен автоматически импортировать все классы, содержащиеся в пространстве имен System, прямо?
Поэтому мне не нужно писать
using System.Windows.Form;
Я бы понял, даже если using Windows.Form
работал. Но компилятор не смог его решить! Какова точка using System;
до этого?
Итак, почему using System;
не импортировать System.Windows
автоматически, а также System.Windows.Forms
- извините, если здесь не используется импорт слов. Возможно, переходить в глобальное пространство имен является правильной терминологией.
Ответы
Ответ 1
С# не является Java.
A using
директива используется, поэтому вам не нужно вводить полное имя типа. Это также помогает с неоднозначными именами типов (например, с использованием псевдонимов).
В случае Console
, например, вам не нужно вводить System.Console
.
Важно понимать разницу между пространством имен и сборкой - пространство имен является логической группировкой типов. Сборка представляет собой физическую группировку типов. Пространства имен могут охватывать сборки.
Когда вы ссылаетесь на сборку (это больше похоже на импорт пакета в Java), вы получаете доступ ко всем общедоступным типам в нем. Чтобы использовать тип, вам нужно его однозначно идентифицировать. Это делается через пространство имен - директива using
просто означает, что вам не нужно вводить полное имя типа.
Ответ 2
Директива using имеет два применения:
Чтобы разрешить использование типов в пространстве имен, чтобы вам не приходилось квалифицируйте использование типа в этом пространстве имен:
с использованием System.Text;
Чтобы создать псевдоним для пространства имен или типа. Эта называется директивой псевдонимов.
с помощью Project = PC.MyCompany.Project;
http://msdn.microsoft.com/en-us/library/sf0df423.aspx
Однако вы должны заметить, что System и System.Windows.Form не связаны ни с каким именем. Если вы импортируете (используя) систему, это означает, что вы будете использовать типы сборки системы в этом классе. Фактическая ссылка, указанная в разделе ссылок в проекте Visual Studio, которую вы действительно можете использовать (даже без использования оператора, поскольку это просто ярлык для типов).
Ответ 3
С# не импортирует вложенные пространства имен, и это по дизайну.
Область пространства имен позволяет организовывать код и дает вам способ создания глобально уникальные типы.
Вложенные пространства имен используются для группировки связанных функций, но используют их по требованию.
Я думаю, вы не хотели бы иметь все типы из такого большого пространства имен, как System
, если вам нужно только System.Windows
.
Так что, наверное, вопрос в том, почему С# не имеет что-то вроде using System.*;
, например java. Я не знаю ответа, но я думаю, это из-за принципа KISS. Это что-то вроде использования
select *
вы никогда не узнаете, какие типы вы добавите и как они повлияют на существующий код.
Ответ 4
Даже в Java вам придется явно писать
import System.*;
В большинстве случаев вы не хотите все вложенные пространства имен. Это просто загромождает IntelliSense.
Ответ 5
Синтаксис "using" позволяет вам сокращать доступ к пространствам имен, которые уже указаны как ссылки в настройках проекта. Если пространство имен указано как ссылка, у вас уже есть доступ к нему с полным именем без директивы "using". Просто сохраняет нажатия клавиш.
Ответ 6
"Использование" данного пространства имен означает, что вы получите доступ ко всем определениям, реализованным непосредственно в нем, а не к тому, что он будет рекурсивно искать вложенные пространства имен; иначе это победит цель выражения "Использовать".
Пространства имен существуют, чтобы избежать неоднозначности имени класса. Инструкция "Использовать" здесь, чтобы избежать использования полностью квалифицированных типов, вложенных в пространства имен, когда вы знаете, что (или мало) может возникнуть неоднозначность.
Ответ 7
Нет, это не так, как это работает.
И я дам хороший аргумент против того, что вы сказали: intellisnse сойдет с ума, и найти то, что вы хотите, будет ад.
У вас есть доступ ко всему на каждом доступном пространстве имен (с точками), ключевое слово using
упрощает это, потому что вам не нужно указывать, из какого пространства имен происходит "класс из класса или структуры" (я имею в виду, определенный).