пространство имён namespace и using
Участников: 2
Страница 1 из 1
пространство имён namespace и using
Давайте поговорим об именах. О том как можно использовать два одинаковых имени для совершенно разных переменных или функций.
Во-первых, зачем нам нужны какие-то пространства имён?
Когда мы используем несколько библиотек функций от разных разработчиков, то может возникнуть проблема, если в этих библиотеках две разные функции называються одинаково.
Можно конечно называть функции в одной библиотеке, добавляя специальный префикс. Но это не так удобно, на практике. А имена функций из коротких и понятных превращаються в длинные и неудобные.
Для разрешения подобных проблем, в язык программирования была добавлена возможность создания своего пространства для имени.
конструкция
Создаёт подпространство имён.
Для каждого пространства, вам необходимо указать его имя или идентификатор.
Это будет как префикс, но он будет подставляться автоматически.
Очень похоже на объеденение в одну семью.
namespace задаёт общую фамилию.
Вы же не обращаетесь к жене / брату / сестре по фамилии + имени. Достаточно только имя.
Вы входите в семью и у вас у всех одна фамилия, это ваше именное пространство.
Но в официальных учреждениях, вне семейного круга, нужно использовать имя + фамилию, чтобы не перепутать, вас с вашим тёской.
Чтобы обратиться к переменной, типу, или процедуре внутри пространства некого имени из вне, нужно указать имя полностью, указав сначало название пространства и отделив его точкой.
В нутри блока Namespace ... end Namespace можно создавать пользовательские типы (классы) переменные процедуры и функции.
Но там не может быть простых исполняемых инструкций.
В реальной жизни придя в какой-нибудь клуб или в дружескую компанию, мы можем отбросить официоз. Мы переходим на ты и сливаем наши пространства имён с друзьями.
Так работает using.
Указывает какое пространство имён нужно подключить.
Теперь не нужно указывать префикс, достаточно лишь внутреннего имени.
Можно через запятую перечислить и другие пространства имён.
При раскрытии пространства имён происходит наложение. Но при этом все глобальные имена, которые были у вас, будут по прежнему доступны.
Традиционно пространства имён раскрывают в начале файла.
Но его можно раскрыть и локально, например в процедуре.
Эффект раскрытия имени будет работать только в текущей области видимости.
В тех случаях, когда есть два имени, в глобальном пространстве и в именованном выбираеться глобальное. Чтобы получить доступ к имени из определённого пространства, нужно его указывать.
Нет смысла раскрывать много пространств имён. Так вы можете запутаться. Подключайте только те, которые вам действительно нужны.
В некотором роде класс, создаёт своё пространство имён.
Внутри класса, вы можете обращаться к методам и свойствам по короткому имени.
Если же хотите получить доступ к членам класса из вне, то должны писать полное имя.
Подробности смотрите в соответствующих главах.
Во-первых, зачем нам нужны какие-то пространства имён?
Когда мы используем несколько библиотек функций от разных разработчиков, то может возникнуть проблема, если в этих библиотеках две разные функции называються одинаково.
Можно конечно называть функции в одной библиотеке, добавляя специальный префикс. Но это не так удобно, на практике. А имена функций из коротких и понятных превращаються в длинные и неудобные.
Для разрешения подобных проблем, в язык программирования была добавлена возможность создания своего пространства для имени.
конструкция
- Код:
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 раз(а)
Re: пространство имён namespace и using
Как вернуться из пространства имён "а" в исходное?
Последний раз редактировалось: Gena (Пн Авг 24, 2009 11:51 pm), всего редактировалось 1 раз(а)
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва
Re: пространство имён namespace и using
Можно ограничить область действия using
- Код:
scope
' раскрываем внутри блока
Using a
print b
end scope
' уже не верно!
print "global: "; b
Re: пространство имён namespace и using
Вообще-то ты входишь в пространство с помощью
Namespace simple
А выходишь из пространства
end Namespace
Если же ты спрашиваешь об отмене действия
using simple
То я не знаю другого способа, кроме как поместить всё в локальную область видимости.
scope
using simple
...
end scope
Если мой ответ тебя не устраивает, то так и напиши.
А если устраивает, то тоже былобы не плохо сообщить об этом.
Я же вижу, что ты сообщение отредактировал через пару минут после моего ответа.
Но твоего намёка не пойму!
Namespace simple
А выходишь из пространства
end Namespace
Если же ты спрашиваешь об отмене действия
using simple
То я не знаю другого способа, кроме как поместить всё в локальную область видимости.
scope
using simple
...
end scope
Gena пишет:
Как вернуться из пространства имён "а" в исходное?
Если мой ответ тебя не устраивает, то так и напиши.
А если устраивает, то тоже былобы не плохо сообщить об этом.
Я же вижу, что ты сообщение отредактировал через пару минут после моего ответа.
Но твоего намёка не пойму!
Re: пространство имён namespace и using
Я отредактировал "вернуть" на "вернуться" =)
Я думал, что есть какая-нибудь функция "using global" или что-нибудь в этом роде(которая возвращает в исходное пространство, где ты был до этого).А так придётся заморачиваться соscope.
Я думал, что есть какая-нибудь функция "using global" или что-нибудь в этом роде(которая возвращает в исходное пространство, где ты был до этого).А так придётся заморачиваться соscope.
Gena- Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 31
Откуда : Москва
Re: пространство имён namespace и using
Мне сегодня про это снился сон.
Там была вообще невообразимая конструкция, что-то вроде
А вообще зачем тебе возвращаться? Проще всего не сливай области видимости.
Там была вообще невообразимая конструкция, что-то вроде
- Код:
>>>=using .
А вообще зачем тебе возвращаться? Проще всего не сливай области видимости.
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения