пространство имён namespace и using

Предыдущая тема Следующая тема Перейти вниз

пространство имён namespace и using

Сообщение  Eric-S в Пн Авг 24, 2009 10:16 pm

Давайте поговорим об именах. О том как можно использовать два одинаковых имени для совершенно разных переменных или функций.

Во-первых, зачем нам нужны какие-то пространства имён?

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

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

Для разрешения подобных проблем, в язык программирования была добавлена возможность создания своего пространства для имени.

конструкция
Код:

namespace <i>{имя}</i>
...
' блок кода, включая типы, переменные и функции.
...
end namespace

Создаёт подпространство имён.
Для каждого пространства, вам необходимо указать его имя или идентификатор.
Это будет как префикс, но он будет подставляться автоматически.

Очень похоже на объеденение в одну семью.
namespace задаёт общую фамилию.
Вы же не обращаетесь к жене / брату / сестре по фамилии + имени. Достаточно только имя.
Вы входите в семью и у вас у всех одна фамилия, это ваше именное пространство.

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

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


Код:

' создаём пространство имени "sample"
Namespace sample

' создаём переменную
dim mivar as integer = 333

' закрываем пространство имени "sample"
end Namespace

' обращаемся к переменной из пространства имени
print sample.mivar

В нутри блока Namespace ... end Namespace можно создавать пользовательские типы (классы) переменные процедуры и функции.
Но там не может быть простых исполняемых инструкций.

В реальной жизни придя в какой-нибудь клуб или в дружескую компанию, мы можем отбросить официоз. Мы переходим на ты и сливаем наши пространства имён с друзьями.
Так работает using.

Код:

using имя {, ещё_имя ... }

Указывает какое пространство имён нужно подключить.
Теперь не нужно указывать префикс, достаточно лишь внутреннего имени.

Можно через запятую перечислить и другие пространства имён.

Код:

' создаём пространство имени "sample"
Namespace sample

' создаём переменную
dim mivar as integer = 333

' закрываем пространство имени "sample"
end Namespace

' раскрываем пространство имени sample
using sample

' теперь нам не нужно указывать пространство имени
print mivar

При раскрытии пространства имён происходит наложение. Но при этом все глобальные имена, которые были у вас, будут по прежнему доступны.

Традиционно пространства имён раскрывают в начале файла.
Но его можно раскрыть и локально, например в процедуре.
Эффект раскрытия имени будет работать только в текущей области видимости.

Код:


' создаём пространство имени "a"
Namespace a

' создаём переменную
dim b as integer = 456

' тестовая процедура
sub foot()

' внутри пространства имён,
' можем к переменной обращаться по короткому имени
print "foot: "; b
end sub

end Namespace

' мы можем обратиться к этой переменной по полному имени
print a.b

' или процедуре
a.foot

' а можем просто локально раскрыть (наложить) пространство имён
Using a
print b
foot

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

Код:


' создаём пространство имени "a"
Namespace a

' создаём переменную

' тестовая процедура
sub foot()
print "a.foot"
end sub

end Namespace


' процедура в глобальном пространстве имени
sub foot()
print "global"
end sub


' раскрыть пространство имени
Using a

' будет вызвана глобальная процедура
foot

' чтобы обратиться к одноимённой процедуре
'  из некого пространства имени,
' нужно указывать полное имя этой процедуры
a.foot

Нет смысла раскрывать много пространств имён. Так вы можете запутаться. Подключайте только те, которые вам действительно нужны.


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


Последний раз редактировалось: Eric-S (Вт Авг 25, 2009 12:27 am), всего редактировалось 3 раз(а)

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: пространство имён namespace и using

Сообщение  Gena в Пн Авг 24, 2009 10:56 pm

Как вернуться из пространства имён "а" в исходное?


Последний раз редактировалось: Gena (Пн Авг 24, 2009 11:51 pm), всего редактировалось 1 раз(а)

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 24
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: пространство имён namespace и using

Сообщение  Eric-S в Пн Авг 24, 2009 11:41 pm

Можно ограничить область действия using

Код:

scope
' раскрываем внутри блока
Using a
print b
end scope

' уже не верно!
print "global: "; b

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: пространство имён namespace и using

Сообщение  Eric-S в Вт Авг 25, 2009 12:32 am

Вообще-то ты входишь в пространство с помощью
Namespace simple

А выходишь из пространства
end Namespace

Если же ты спрашиваешь об отмене действия
using simple

То я не знаю другого способа, кроме как поместить всё в локальную область видимости.
scope
using simple
...
end scope

Gena пишет:
Как вернуться из пространства имён "а" в исходное?

Если мой ответ тебя не устраивает, то так и напиши.
А если устраивает, то тоже былобы не плохо сообщить об этом.

Я же вижу, что ты сообщение отредактировал через пару минут после моего ответа.
Но твоего намёка не пойму!

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: пространство имён namespace и using

Сообщение  Gena в Вт Авг 25, 2009 2:50 pm

Я отредактировал "вернуть" на "вернуться" =)
Я думал, что есть какая-нибудь функция "using global" или что-нибудь в этом роде(которая возвращает в исходное пространство, где ты был до этого).А так придётся заморачиваться соscope.

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 24
Откуда : Москва

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: пространство имён namespace и using

Сообщение  Eric-S в Вт Авг 25, 2009 2:53 pm

Мне сегодня про это снился сон.
Там была вообще невообразимая конструкция, что-то вроде
Код:

>>>=using .

А вообще зачем тебе возвращаться? Проще всего не сливай области видимости.

Eric-S

Сообщения : 738
Дата регистрации : 2008-08-06
Возраст : 34
Откуда : Россия, Санкт-Петербург

Посмотреть профиль http://eric50.narod.ru

Вернуться к началу Перейти вниз

Re: пространство имён namespace и using

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения