Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Пространство имён.

37K
15 октября 2010 года
Subaro
14 / / 07.03.2009
Вот меня заинтересовал что же такое пространство имён и что это такое на физическом уровне. Определение мне понятно, вот к примеру на вики:
Пространство имён — некоторое множество каким-либо образом взаимосвязанных имён или терминов.

А что же происходит когда мы пишем: using System? Понятно что System это пространство имён, в котором хранятся множество классов, структур и типов и т.д. Но на физическом то уровне что происходит?
11
15 октября 2010 года
oxotnik333
2.9K / / 03.08.2007
текущее пространство имен расширяется пространством, указанным после using. Т.е. указание компилятору, что определение того или иного объекта надо искать не только в пользовательском пространстве, но и в подключенных.
Это все равно что у тебя была онда квартира, ты говорил "у меня" и подразумевалось что в пределах одной квартиры, потом еще одну купил - расширил пространство, теперь "у меня завалялосб" означает что искать надо уже в 2-х квартирах.
37K
15 октября 2010 года
Subaro
14 / / 07.03.2009
Спасибо! Ответ хороший.
41K
19 октября 2010 года
gaga
44 / / 22.07.2009
Цитата: Subaro

А что же происходит когда мы пишем: using System? Понятно что System это пространство имён, в котором хранятся множество классов, структур и типов и т.д. Но на физическом то уровне что происходит?


Если под физическим уровнем ты имеешь в виду, какой исполняемый код сгенерирует компилятор, то никакой.
Пространства имен были придуманы для того, чтобы не возникало конфликтов в больших проектах. Т.е. если в проекте используются две библиотеки, в каждой из которых определена функция int foo(int), то при включении их заголовков в файл без использования пространств возник бы конфликт имен. Таким образом, пространства имен предназначены для того, чтобы явно указать компилятору, какое определение использовать и скрыть неиспользуемые. По умолчанию он ищет только в глобальном пространстве имен ::, а с помощью директивы using ты добавляешь имена в текущую область видимости(где искать имена). Почитай про области видимости и их разрешение.
Пространства имен НЕ порождают никакого кода на этапе выполнения, влияют только на компиляцию.

5
19 октября 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: gaga
По умолчанию он ищет только в глобальном пространстве имен ::


Вы заблуждаетесь, :: - это не глобальное пространство имен. Это квалификатор алиаса пространства имен. Алиас global закреплен за глобальным пространством имен.
С помощью этого квалификатора указываются совершенно точные имена, которые компилятор не ищет используя директивы using. Например, полностью квалифицированное имя стандартного знакового 32-битного целого будет таким:

 
Код:
global::System.Int32


Можно создавать и свои алиасы, действующие в рамках файла:
 
Код:
using mysystem = global::System;


Использовать можно так:
 
Код:
mysystem::Int32

или так:
 
Код:
mysystem.Int32

В первом случае мы не оставляем компилятору сомнений насчет mysystem - это алиас пространства имен, во втором же случае он будет устанавливать смысл mysystem по контексту, так как использована точечная нотация.

Еще есть директива extern alias, но о ней в других сериях. :)
41K
20 октября 2010 года
gaga
44 / / 22.07.2009
Цитата: hardcase
Вы заблуждаетесь, :: - это не глобальное пространство имен. Это квалификатор алиаса пространства имен. Алиас global закреплен за глобальным пространством имен.


Просто мы, видимо, говорим о разных языках. Я писал о С++ т.к. не знаю C#, а вопрос ОПа вполне себе корректен в С++. В плюсах нет пространства global.
Цитирую Страуструпа:

Цитата:
... ::k означает "искать k в глобальном пространстве имен и в пространствах имен, упомянутых в using-директивах в глобальном пространстве имен."

5
21 октября 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: gaga
Просто мы, видимо, говорим о разных языках. Я писал о С++ т.к. не знаю C#, а вопрос ОПа вполне себе корректен в С++. В плюсах нет пространства global.
Цитирую Страуструпа:


"using System" всетаки намекает нам на язык, используемый автором. ;)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог