|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Простори імен
При
використанні коди, написаної іншими програмістами, завжди виникає потенційна
небезпека конфліктів імен. Але навіть якщо забути про ці конфлікти, все одно
необхідно якимсь чином згрупувати тисячі методів відповідно до їх функціонального
призначення. Отже, у величезній бібліотеці класів .NET повинен існувати
який-небудь спосіб логічного угрупування інформації. У .NET це завдання вирішується
за допомогою просторів імен. Звичайно, ви можете створювати власні
простори імен; нижче в цьому розділі ми покажемо, як це робиться. У кожному місті є своя Головна Вулиця, а в кожній бібліотеці неодмінно знайдеться метод з ім'ям Open. Простори імен дозволяють розрізняти ці методи. Наприклад, в просторі імен System. 10 зібрані методи для виконання файлових операцій; у нього входить клас Fil е, а в цьому класі є метод Open. Повне ім'я методу виглядає так: System.I0.File.Open Клас File
є частиною простору імен System. I0, тому він не конфліктує з іншим
класом File з простору імен Cornell .Morrison.NiftyClasses, який також
може містити власний метод Open.
Звертаючись до
хороших знайомих, ми не називаємо їх по імені-по батькові і прізвищу. У .NET передбачена
можливість імпортування просторів імен командою Imports, що дозволяє
позбавитися від громіздких повних імен. Після правильної команди Imports всі посилання
вигляду System.Text.StringBuilder
. можуть замінюватися
простим ім'ям Stringbuilder. Простір
імен System автоматично імпортується в кожне рішення, створене в Visual
Studio. Завдяки цьому методи цього простору імен можуть викликатися у вигляді
Console.WriteLine() замість повного імені System.Console.WrlteLlne(). Список просторів імен,
що автоматично імпортуються в рішення, знаходиться на сторінці Imports вікна
властивостей рішення (мал. 4.2). Завантажите в Object
Brewser простір імен Microsoft, що автоматично імпортується. Visual Basic
— ви побачите, що воно містить різні функції, що існували в Visual
Basic і збережені в VB .NET (мал. 4.3). Імпортування
простору імен Microsoft. Visual Basic. Constants дозволяє використовувати
старі константи VB — такі, як vbcrtf. .NET-версии багатьох констант не мають
префікса vb (наприклад, Crlf) і знаходяться в просторі імен Microsoft.VIsualBasi
з.Control Chars. Команда Imports
повинна розташовуватися перед рештою всіх оголошень, включаючи оголошення
імені модуля, але після директив Option (таких, як Option Strict On або Option
Compare Text).
Мал.
4.2. Сторінка Imports
вікна властивостей рішення
Мал.
4.3. Простір імен Microsoft.VisualBasic у програмі Object Browser Команда Imports не збільшує
об'єм програми, оскільки вона не включає весь код простору імен в
проект, а просто спрощує посилання на члени класів, що входять в простір імен.
На швидкість роботи вона теж не впливає. Імпортуються тільки простори імен,
що входять в складки, посилання на яких були включені в програму командою
Project > Add Reference (складки розглядаються в розділі 13). Якщо два
імпортовані простори імен містять класи з однаковими іменами, то
для розрізнення цих класів вам доведеться указувати їх повні імена (VB .NET
не дозволяє створити два однойменні класи в одному просторі імен). Особлива версія
команди Imports використовується для запобігання потенційним конфліктам імен
з раніше імпортованими класами. Наприклад, якщо ви захочете працювати на рівні
сумісності з колишніми версіями Visual Basic (чого робити не рекомендується),
в програмі майже напевно виникнуть конфлікти імен. Включите в програму посилання
на рівень сумісності VB, а потім скористайтеся командою вигляду: Imports Vb6stuff
= Microsoft.VisualBasic.Compatibility.VB6 Після цього
залишається лише починати всі посилання на рівень сумісності з префікса «Vbsstuff.»,
і всі проблеми з конфліктами імен зникнуть. З простору імен
не можна імпортувати окремий клас, щоб спростити введення імен його членів.
Припустимо, ви хочете імпортувати клас Directoryinfo, щоб спростити введення
імен його членів. Але наступна команда недопустима: Imports System.IO.Directorylnfo
Щоб розглянути приклад використання Imports на скільки-небудь нетривіальному прикладі, ми візьмемо клас Directorylnfo з простору імен System. IO. Як підказує само назву, клас Directorylnfo містить методи для отримання інформації про вміст каталогів, виведення повного імені каталога і так далі Одін з конструкторів цього класу отримує рядок з ім'ям каталога, який ви хочете проаналізувати (якщо передане ім'я не є абсолютним, конструктор вважає, що воно задається щодо поточного каталога програми). Правильно написана команда Imports дозволяє замінити довгу команду Dim dirlnfo As New System.IO.Directory!nfo("C:\") компактнішою і зрозумілішою командою Dim dirlnfo As
New Directoryinfo("C:\") Наступна програма
виводить список всіх каталогів на жорсткому диску, в її роботі використовуються рекурсія
і клас Directorylnfo. Ключову роль в ній грає метод Getdi rectories (),
що повертає колекцію підкаталогів. Функція Listdi rectories перебирає
вміст колекції і рекурсивно викликається для кожного елементу: Option Strict
On Imports System.IO Module Modulel Sub Main()) Dim dirlnfo
As New Directoryinfo("C:\") Listdirectories(dirinfo) End
Sub Sub Listdirectories(Byval thedirectory As Directorylnfo) Dim tempdir*as
Directoryinfo Console. Wri.teLi
net thedi rectory .Full Name()) For Each terrain
In thedi rectory. Getdi rectories () Listdirectories(tempoir)
Next End Sub End Module Якщо ви звикли
до рекурсивного перебору каталогів з використанням старої функції Dir, ви оціните,
наскільки спростив цю програму в .NET чудовий метод Directorylnfo.
Довідкова система і .NET Framework
У
бібліотеку .NET Framework входять сотні просторів імен, кожне з яких містить
безліч корисних класів. По масштабах і можливостях .NET Framework порівнянна з
повним інтерфейсом Win32 API. Бібліотека настільки величезна, що описати її в
одній книзі просто неможливо. Хоча цей розділ дає початкове уявлення про
деякі класи .NET Framework, якнайскоріше приступайте до читання документації .NET. Почніть
з розділу «.NET Framework Class Library» і знайдіть описи просторів
імен, що представляють для вас інтерес. Як показано на мал. 4.4,
в довідковій системі перераховані всі класи кожного простору імен. Кожне ім'я
класу в лівому стовпці є гіперпосиланням, ведучою до докладного опису
класу. У нижній частині опису класу перераховані імена його членів. Якщо
клацнути на будь-якому з цих імен, ви перейдете до докладного опису відповідного члена.
Звернете увагу: VB .NET вже не вважається за другорядну мову — синтаксис
всіх членів приводиться для VB, VC і С#. На мал. 4.5 показаний приклад документації
класу Directorylnfo в бета-версиі 2. Щоб отримати докладний
опис методу Getdi rectories, використаного в попередньому прикладі, клацніть
на посиланні Directorylnfo в нижній частині сторінки, а потім клацніть на посиланні
Getdi rectories. Зовнішній вигляд сторінки показаний на мал. 4.6. Деякі терміни,
що зустрічаються на цій сторінці (такі, як Pri vate), розглядаються
далі в цьому розділі
Класи колекцій в .NET Framework
Щоб
збудити у вас інтерес .NET Framework, ми коротко розглянемо деякі класи колекцій.
У цих класах реалізуються стандартні структури даних, часто використовувані
в нетривіальних програмах. Колекції настільки важливі, що вони за умовчанням
автоматично імпортуються в кожне вирішення VB .NET (у просторі імен System.Collections).
Мал.
4.4. Простір імен System.10 в довідковій системі В
сукупності ці класи залишають далеко позаду примітивний клас Collection з Vb6.
Найкорисніші класи колекцій перераховані в таблиці. 4.2. У наступних двох розділах
розглядаються основні принципи роботи з двома найважливішими класами: Arraylist
і Hashtable. Знайомство з дуже важливим класом Dictio-narybase відкладається
до наступного розділу, присвяченого спадкоємству. Таблиця
4.2.
Основні класи колекцій
Мал.
4.5. Клас
Directoryinfo в довідковій системі
Клас Arraylist
реалізує динамічний масив, розміри якого автоматично збільшуються
і зменшуються у міру потреби. Динамічні масиви працюють трохи повільніше
за звичайні масиви, але вони помітно спрощують багато завдань програмування.
Крім того, на відміну від більшості масивів клас Arrayli st є
гетерогенним, тобто дозволяє зберігати об'єкти різних типів. В розділі 5 буде показано, як
створити клас Arraylist для зберігання об'єктів лише одного типу; ви також дізнаєтеся
про деякі нюанси, пов'язані із зберіганням узагальнених об'єктів в Arrayli St.
Використання Arraylist замість базового масиву означає, що вам не доведеться часто
викликати Redim Preserve для збереження існуючих даних. Досить викликати
метод Add, і клас Arraylist сам виконає всю чорнову роботу. Клас Arraylist
містить ряд інших корисних методів. Наприклад, метод Addrange дозволяє перенести
в динамічний масив весь вміст існуючого масиву всього однією
командою. Після завершення обробки елементи можна скопіювати назад. Зокрема,
це дозволяє легко об'єднати вміст двох масивів. У таблиці. 4.3 перераховані
основні члени класу Arraylist (повний список приведений в електронній документації).
Мал. 4.6 . Метод Getdirectories в довідковій системі Таблиця
4.3.
Найважливіші члени класу Arraylist
Серед властивостей
класу Arraylist найбільший інтерес представляє властивість Item, яка представляє
елемент із заданим індексом. Приклад: Consolе.WriteLinediiyList.Item(
1)) Властивість
Item є властивістю за умовчанням класу Arraylist. Це означає,
що при використанні його ім'я може не указуватися, Наприклад, приведена вище
команда еквівалентна наступній команді: Console. Writeline(mylist(1)) У розділі
«Властивості» справжнього розділу ви дізнаєтеся, чим відрізняються властивості за
умовчанням в VB .NET і колишніх версіях VB. У наступному
короткому прикладі масив Arrayli st використовується для введення і збереження невідомої
кількості рядків. При цьому вдається обійтися без команди Redim Preserve, необхідної
при роботі із звичайними масивами. Option
Strict On Module Modulel Sub Main() Dim mylist As
New Arraylist() Dim
thedata As String Console.Write("Please
enter each item and hit Enter key,"_ & "enter ZZZ when done:") thedata =Console.ReadLine() Do Until thedata
="ZZZ" mylist.Add(thedata) Console.WriteC'Please enter each item and hit Enter,"_ & "enter
ZZZ when done:") thedata =Console.ReadLine() Loop Console.WriteLine("You entered "Smylist.Count() & "ITEMS.") Console.ReadLine() End Sub End Module
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||