-
Пространства от имена в .NET Framework
Пространството от имена
(namespace) e логическо групиране на типове за целите на идентификацията. Представете си, че имаме училище, където директорът
е с име Ivan Petrov, учителят по математика е с име Ivan Petrov и пазачът е с име Ivan Petrov.
В този случай името Ivan Petrov е объркващо. Ако касиерът зад бюрото плати
възнаграждението, което се полага на директора не на него, а на пазача, пазачът
ще е доволен, но директорът едва ли. За да разреши това объркване с имена, училището може просто да дефинира
три пространства с имена, наречени:
Principals (директори),
Uchitel (учители), и
Custodial (охранители). Сега вече и трите личности могат
да фигурират с пълните си имена без да стават грешки:
·
Principals.Ivan Petrov
·
Uchitel.Ivan Petrov
·
Custodial.Ivan Petrov
Библиотека .NET
Framework Class Library (FCL),
съдържа няколко хиляди класа и други типове (като интерфейси {
interfaces}, структури {
structures}, и броячи {
enumerations}) които са разделени на
над 90 пространства за имена (
namespaces).
Тези пространства с имена провеждат обслужвания като:
· Основни и нови типове данни и
обработващото изключенията (системно пространство с имена -
System namespace)
· Достъп до данни -
Data access (системно пространство за имена на
данни -
System.Data namespace)
· Елементи на потребителския интерфейс за стандартни Windows апликации (системно пространство за имена на
форми -
System. Windows. Forms namespace)
· Елементи на потребителския интерфейс за web апликации (
System.Web.UI namespace)
Фактически самият език VB .NET е изпълнен като множество от
класове, принадлежащи на
пространството за имена - Microsoft.VisualBasic namespace. (Езиците C#
и JScript са също изпълнени като множество от класове в кореспондиращи
пространства за имена.)
Namespaces (пространствата от имена) не са
задължително уникални за библиотека
Framework Class Library; вие можете също да създадете
собствено пространство за имена използвайки
инструкция Namespace в началото на файла код.
Пространство за имена (
namespace)
е просто начин да организираме обектите в
асемблитата.
Когато имаме много обекти,
namespace
може да улесни достъпа, защото е организирано в йерархична структура, и
свързаните обекти се групират под едно и също разклонение -
node.
Примерно искаме да направим модел на Работилница за Учебна
практика по електроника с нейните
обекти,
свойства и методи. Можем да създадем пространство от имена
Elementi (
namespace). След това можем да създадем подпространства от имена (
subnamespaces). Примерно може да се
работи с елементи транзистори -
Transistors
и елементи диоди -
Diodi като две главни категории.
Вътре в категория transistors може да работите с биполярни -
Bipolar, униполярни PN -
fieldPN, униполярни MOS -
fieldMOS. Може да имате
namespace наречено
Elementi.Transistors. Bipolar, и в това пространство от имена ще
намерите класовете и методите необходими за боравене с биполярни транзистори (
Bipolar). Къде съществуват физически
класовете няма значение за вас; те всички може да са в едно голямо асембли, но
логически са разделени в тези различни
namespaces.
Ако искате да използвате обектите в асемблито без напълно да
ги квалифицирате по всяко време, използвайте инструкция
Imports. Това ви позволява да използвате името на обекта без пълна
квалификация на йерархията в пространството от имена.
Това означава, че следния код е правилен:
Dim x as Button
ако сме използвали оператор Imports
System.WinForms:
Без него реда трябва да изглежда така:
Dim x as
System.WinForms.Button
Всъщност,
MsgBox която
толкова обичаме може да се замести с
System.WinForms.MessageBox
class.
MsgBox още работи за
съвместимост, но е част от пространството за имена
Microsoft.VisualBasic.Interaction, което съдържа редица методи и
апроксимирани функции от предишната версия на VB.
Много елементи на езика са част от
runtime, защото по този начин имат достъп до общата функционалност.
Това означава, че може да отидем в C# и
да имаме кутия за съобщения (
message box),
само чрез импортиране на System.WinForms и извикване на класа MessageBox class.
MessageBox е доста мощен-- методът
Show има например дванадесет вариации.
·
Създаване на ваше собствено пространство
от имена
Вие сте свободни да създадете свое собствено пространство от имена вътре
във вашето асембли. Това става чрез вмъкване на
свой блок Namespace...End Namespace. Вътре в
namespace блока, може да
имате структури, класове, броячи, интерфейси и други елементи.
Можете да именовате това
namespace и то ще получава това, което се импортира в него. Вашият код може да изглежда така:
Namespace VocationalTraining
Public Class Customer
`тук код
End Class
Public Class Student
`тук код
End Class
End Namespace
Пространствата от имена могат да бъдат вложение едно в друго:
Namespace
VocationalTraining
Namespace Customer
Class Training
...
End Class
Class Consulting
...
End Class
End Namespace
Namespace Student
...
End Namespace
End Namespace
Тук имате едно
namespace,
VocationalTraining, което съдържа две
пространства (
namespaces):
Customer и
Student. Пространството от имена
VocationalTraining.
Customer
съдържа класове
Training и
Consulting, така че може да имате
клиенти, които са използвали обучението и други, които са го консултирали. Ако
не искате да създавате изрично пространство от имена, всички ваши класове и
модули ще принадлежат на едно единствено пространство от имена , което се създава по подразбиране и е именовано като
вашия проект. Може да видите това
namespace, и да го промените ако искате, чрез кликване и визуализиране на диалогова кутия
Project Properties във вашия проект. Текстова кутия
Root Namespace представлява кореновото пространство от имена на
вашия проект (
root namespace). Ако декларирате
namespace, вътре в проекта си, то ще се субординира с
това
root namespace. В нашия пример, ако
кореновото пространство от имена на
апликацията ни e
Project1, то пълното пространство
от имена за
VocationalTraining ще бъде
Project1.
VocationalTraining
Друг пример е на апликация с форма, която има бутон, който като се
кликне визуализира съобщителна кутия (message box). Част от генерирания от Windows Form Designer-код се
изтрива, за освобождаване на място. Допълнително
сме изтрили кореновото пространство от имена, спесифицирано в свойствата на апликацията:
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
4 Namespace opitNS.test.example
Public Class frmDemoNameSpace
Inherits System.WinForms.Form
Public Sub New()
MyBase.New()
frmDemoNameSpace = Me
'This call is required by the Win Form Designer.
InitializeComponent()
End Sub
'Form overrides dispose to clean up the component
list.
Public Overrides Sub Dispose()
MyBase.Dispose()
components.Dispose()
End Sub
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As
System.EventArgs)
msgbox("Button Pressed!!!")
End Sub
End Class
20 End Namespace
ww.syngress.com
С цел да наследим или импортираме тази форма, ние се нуждаем от префикс на формата с нейното
namespace. Следващият пример показва
форма, която наследява тази форма. Тази форма наследява всички класове на предишната форма (
frmDemoNameSpace). Най-голямо практическо приложение имат редове 4 и
20.Те капсулират формата в
пространство от имена (определено от програмиста):
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
Public Class inhForm
5 Inherits opitNS.test.example.frmDemoNameSpace
Public Sub New()
MyBase.New
inhForm = Me
'This call is required by the WinForm Designer.
InitializeComponent
End Sub
'Form overrides dispose to clean up the component
list.
Overrides Public Sub Dispose()
MyBase.Dispose
components.Dispose
End Sub
End Class
В този пример можем да видим на ред 5, че тази форма наследява
свойства от форма
opitNS.test.example.frmDemoNameSpace .
Създаването на пространства от имена (
namespaces) e особено полезно при унифициране на код ( повторно
изпълнение на код -
code reuse). Можете да
осъществите функционалност между апликациите с минимални усилия, и много повече ефективност.
Ако дадена група функциии се съдържа в едно
namespace, можете да импортирате това
namespace и след това да имате достъп до
цялата им функционалност. След като се импортира пространството от имена (
namespace), можете да
достигнете неговата функционалност директно. Няма нужда да се пишат префикси с името
на пространството от имена.
Когато използвате команда
Imports, ще ви се предостави списък от
асемблита за избор, а вътре в асемблитата (
assemblies), пространствата от имена (
namespaces) са достъпни.
.syngress.com
Фигура 71 показва пространството от имена
System.IO (както и други
namespaces). Пространството от имена
System.IO--което се съдържа в асембли
mscorlib.dll--e едно от най-широко използваните пространства от имена и съдържа
много функции. Както вече казахме повечето Visual Basic .NET апликации, които използват форми,
разчитат на пространство
System.Winforms. Фигура 3 показва изпълнението на това
пространство с команда
Imports.
-
Разбиране на ключова дума Imports
Imports позволява на класа да използва
namespace със съответна функционалност. Трябва да разположите инструкция
Imports в началото на класа.
Imports върви ръка за ръка с
пространствата от имена.
w.
Команда
Imports е обща за апликациите на Visual Basic .NET, така че трябва да разберем как
действа тя. Ето пример за
използване на инструкция
Imports:
Imports REGTOOL=Microsoft.Win32.Registry
Imports System.Drawing
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As
System.EventArgs)
Dim img As Imaging.Metafile
' част от пространството от имена system.drawing
namespace
img.Save("c:pic.wmf")
REGTOOL.CurrentUser.CreateSubKey("SomeKey")
End Sub
syngress.com
Фигура 71 Пространство от
имена System.IO се импортира
В този пример, когато се натисне команден бутон
button1, се създава подключ (subkey) в регистъра
(registry) наречен
SomeKey.
www.syngress.com
Фигура 72 Импортиране на System.Winforms Namespace
Пространството от имена
Microsoft.Win32.Registry е импортирано и е псевдоним (alias) на
REGTOOL. Това означава, че можем да
използваме
REGTOOL в апликацията.
REGTOOL се пише по-лесно от
Microsoft.Win32.Registry. Не можете да използвате същия псевдоним (alias) за повече от едно
namespace вътре в класа. На ред 4 ще видите обект с префикс пространство от
имена, защото иначе ще възникне конфликт. След като се импортира обекта, всички
негови методи са достъпни без префикс с пространството от имена. Разбира се
ако имате същото име на метод вътре в повече пространства от имена, тогава е
задължително, за да не възникне конфликт. Можете да
използвате инструкция
Imports да добавяте пространства от имена от текущия проект. Когато работите
в развойната среда Visual Basic .NET и извикате команда
Imports, технологията на Microsoft -
IntelliSense ще ви покаже достъпните
namespaces от които може да селектирате. Ако пространството от имена, което търсите го няма в списъка, трябва
да използвате диалогова кутия
Add Reference (изберете
Add Reference от меню
Project).
Диалогова кутия
Add Reference ви позволява да добавите връзка
към други обекти.Тези връзки ще добавят пространства
от имена към падащия списък, който използва команда
Imports.