This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Debug
•
!
Q^: •
«5 Home Page Forml.vb [ D « l g n ] * | Fo ml.vb*
I Ш СЭ sqlserver: latches EL*- C 3 sqlserver:locks \ Ш - D sqlserver: memory manager ш О sqlserver:replication agents EtJ • S sqlserver:replication dlst. Eg.. ! 7 ^ salserverirepltcatton looreader ! Ш GD sqlserver:replication merge S3- F ^ salserver:repteation snapshot ( Ш ЕЗ sqlserver:sql statistics . $•- E 3 sqlserver:user settable | ijj- G3 system EB- O t c p ! ф- Е5 telephony ; ф- 0 3 terminal services ! Щ Q terminal services session ф О thread
_*J
* •
• j F T i a
I ^ J M I I I W N I i W
•
•
•>
~
.
.
.
xi .
.
.
x
Q
1
.
&
^
i
I
я «i S w i i
3- F"^ visual basic.net for developers S E 3 web service r~i ^ 1 й- L^J rrocesses Ш~ *^з Services ф fjp SQL Server Databases
; kezd/
j гпч PetlormanceCoynteri
j
^
" Ln57
СЫ6
C
h
9
Pttc. 2.70. Окно Server Explorer с открытым узлом Performance Counter
Распространенной операцией в бизнес-приложениях является добавление единицы к Performance Counter каждый раз, когда происходит щелчок на форме. Пример кода, реализующего описанную выше операцию, приведен на рис. 2.11. Этот пример содержит код, сгенерированный дизайнером при перемещении на форму элемента Performance Counter, и добавленный вручную метод Forml C l i c k . 32
Гпааа 2. Visual Studio.NET
VS Home Роде Furm.ivb£Dt"*n2) •'. Private bub InitBlceComponentO Me.components = New System.ComponentModel.Container)) Me.PerfbrmanceCounlerl = New System.Diagnostcs.PerfbrmanceCountErO '©design MeTrayHelght = 90: ! '©design Me.TrsyLargelcon = Fa ise '©design MeJrayAutoArrange = True | PerfbrmanceCounterl.CategoryName = "visual bast,net for developers" PerfbrmanceCaunterl.CounterName = "Ttmesheet Entry" PerformanceCounterl.MachineNarre = "red-leader" Me.Text = "Forml" Me.AutaScateBaseSae = Mew System,Drawing.Seep, 13) !• End Sub | *End Rego in Щ
: To Г Sheeted . F Enabled F »sble Г jMndowU приведено окно References в Visual Basic 6. Диалоговое окно References в Visual Basic 6 [rsert | Delete имело фиксированный размер. Поэтому зачастую было сложно определить, какой СОМобъект выбирается для ссылки, особенно если он имел длинное имя или находился глубоко в структуре каталогов. На рис. 2.15 показано новое, более удобное диалоговое окно Add References в VB.NET. Это окно имеет отдельные вкладки для ссылок на элементы .NET Framework, компоненты СОМ и другие проекты. Puc. 2.12. Окно Menu Editor в Visual Basic 6 10
Интегрированная среда разработки Visual Studio.NET
1
33
:
'» ArraySort - Microsoft Visual Basc i.NET tdesignj - Foml.vb tte Ed* Sew Proe j ct Bud l Debug Toos l Wnidow Hep l • g l v S ',& О в ! •!
;>
Л f«
•••-' -
•
:
ft NFT^Frft.. z. Selected Cowonentst Component Name :
I Type
• •
|
Cancel
Help
Puc. 2.15. Диалоговое окно Add References в VB.NET
VisuatStudfo - Microsoft VisualBosicNET [design] - Fonn1 ,vb Fie £d* Ve iw Projed Quad Debug loots frid i ot» 4 • x ; a
Start Page Fofrnl .vb [Design.]* Forml.vb* | »| |(Declarations) I^JForml (VisualS(udio) Public ciassForini Inherits Svstem.Windows.Formsform Windows Form DesiqnfT >-f4**> ,*и^.'< < ode )
|ф iRegiorT^AppScatfon Logic* |e Privattj Sub Forml_Load(ByVal sender As System.Object, i PerformanceCounterl.IncrementBy(l) | i End Sub H#End Region | L End Class
s System£ventArgs) Нл
>£] Output Tasklfal "Ready
j: Ln S8
Cd 1
Ch 1
Puc. 2.16. Свертываемые блоки кода
Редактор кода Visual Studio.NET
35
При щелчке на этих пиктограммах блок кода сворачивается или разворачивается. Среда Visual Studio.NET автоматически создает блоки кода для каждой процедуры и класса. Кроме этого, можно определить собственные свертываемые блоки кода с помощью команд редактора #Region и #End Region, как показано в листинге 2.1. Листинг 2.1. Использование команд #Region и #End Region #Region "Мой собственный блок кода" P r i v a t e Sub DoSomething() End Sub Private Sub DoSomethingElse() End Sub #End Region Когда блок кода, определенный с помощью команд #Region и #End Region, находится в свернутом состоянии, то в окне редактора отображается только строка текста из команды iRegion, а остальная часть кода скрыта. Таким образом, команды редактора #Region и #End Region позволяют лучше организовать код, группируя методы в соответствии с выполняемыми ими функциями. На рис. 2.17 показан тот же код, что и на рис. 2.16, но в свернутом состоянии. VisualSludio Microsoft Visual Basic.NET [Assign] - Fonni.vb* Edit Wew Erojert guid QcbuQ
look Window ЦФ
Я %, iL, « I да ф I i 2 1 A % % Forml.vb[Design]* Forml.vb* |
'JFornil (VisualStudio)
|H\(Dedaratloni)
Гв Public Class Forml Inherits System.Windows.Forms.Form
' i SP-hi
it м п i uii't
End'class""
Output
T a s k List
Ready
Puc. 2.17. Свернутый блок кода
Автоматическое форматирование и завершение ввода кода Другими замечательными свойствами Visual Studio.NET являются автоформатирование и автоматическое завершение ввода кода. Например, когда в редакторе кода вводится оператор If, то редактор Visual Studio.NET автоматически вставляет блоки E l s e 36
Глава 2. Visual Studio.NET
и End If и смещает вправо любой код, помещаемый между блоками I f n E l s e n между E l s e и End If. Редактор имеет еще несколько интересных свойств форматирования. •
Номера строк могут автоматически вставляться и пересчитываться по мере ввода кода.
•
Можно активизировать перенос слов, чтобы код не выступал за границу экрана.
•
Всплывающие подсказки доступны для любого элемента кода. Если с кодом поставляется документация в формате XML (эта документация доступна в VB.NET как расширение), то при помещении указателя мыши на какой-либо метод, появляется всплывающее окно с описанием этого метода.
Включение URL в код и комментарии Новым свойством редактора кода Visual Studio.NET является возможность добавления адреса URL в программный код и комментарии. Например, можно поместить ссылку на дополнительную справку для фрагмента кода непосредственно внутрь этого кода или же поместить в код ссылку на адрес электронной почты разработчика, щелкнув на которой можно отправить свои заметки автору. При переносе кода проектов Visual Basic 6 с помощью мастера переноса (VB 6 Migration Wizard) эти ссылки используются для указания местоположения более детального описания кода.
Другие редакторы С VB.NET поставляется несколько других редакторов, помогающих разработчикам в процессе создания приложений. К этим редакторам относятся: редактор каскадных листов стилей (Cascading Style Sheet), редактор XML, редактор XSL, редактор хранимых процедур и редактор HTML. Во всех этих редакторах реализована технология IntelliSense. Особенно интересны редакторы HTML и XML. Например, редактор HTML автоматически подстраивается к выбранной версии языка разметки, а редактор XML проверяет правильность вводимых данных на основе выбранной схемы.
Visual Basic и .NET Framework Visual Basic существует около десяти лет. За это время было выпущено шесть версий. Visual Basic развился из простого, в некоторой степени ограниченного средства быстрой разработки до мощного инструмента разработки современных приложений, который также превосходно подходит для создания СОМ-компонентов. Однако, несмотря на то что Visual Basic стал наиболее популярным средством разработки, он имеет репутацию "игрушечного" языка, не подходящего для реализации серьезных проектов. И хотя подобное утверждение никогда не соответствовало действительности, некоторые разработчики презрительно относятся к Visual Basic по ряду причин. •
Затруднительное использование функций Windows API.
• Неполная поддержка объектно-ориентированной модели. • Необходимость в промежуточной среде исполнения. В то же время в Visual Basic реализован ряд великолепных средств, которые изменили индустрию разработки программного обеспечения. Другие редакторы
37
•
Компонентно-ориентированная разработка приложений с применением элементов управления (VBX и их преемников ActiveX).
•
Модель быстрой разработки приложений.
•
Инструменты визуального проектирования.
• Событийное программирование. Создатели платформы .NET Framework взяли из Visual Basic лучшие свойства и, доработав их, сделали доступным для разработчиков программ на других языках. Многие конструкторские решения в Visual Studio.NET также эволюционировали из Visual Basic, например, цитируя Давида Мендлена (David Mendlen) из Microsoft, основная цель проектирования ASP.NET — сделать разработку Internet-приложений "такой же простой, как и создание программ с помощью Visual Basic".
Введение BVB.NET При создании среды .NET Framework компания Microsoft использовала новый язык программирования, называемый С#. Поэтому многие полагают, что для разработки в среде .NET лучше всего обратиться к С#. Но С# использован Microsoft просто потому, что он был первым языком, реализованным в .NET, и поэтому имеет наилучшую поддержку. Платформа .NET Framework может поддерживать практически все существующие языки программирования, и в первую очередь — Visual Basic. При создании Visual Basic.NET язык Visual Basic был полностью переписан. Все же, несмотря на многочисленные изменения, он сохранил большую часть привычного для программистов синтаксиса, и новые синтаксические дополнения следуют установленным в языке традициям. Visual Basic, в отличие от C/C++, никогда не был стандартизованным языком. Его синтаксис всегда контролировался компанией Microsoft, а развитие никогда не ограничивалось рамками стандартов. Отсутствие стандартов хорошо служило развитию Visual Basic в прошлом, но также позволяло Microsoft вносить в него изменения, которые могли нарушить работу приложений, созданных с помощью предыдущих версий языка. С появлением .NET Framework эта тенденция будет изменена, поскольку несоблюдение совместимости в последующих версиях VB.NET будет означать разрушение всей платформы .NET Framework. VB.NET поддерживает все возможности среды .NET. Более того, VB.NET — это основной инструмент разработки полностью управляемых приложений, использующих платформу .NET Framework.
Цели проектирования VB.NET Компания Microsoft постепенно уходит с рынка операционных систем в сторону рынка предоставления услуг через Internet. Эти услуги, известные как Web-службы, позволят разработчикам создавать "настоящие" распределенные приложения. Для обеспечения поддержки этой концепции задача проектирования VB.NET формулировалась приблизительно так: сделать для разработки Web-служб то же, что сделала первая версия Visual Basic для разработки Windows-приложений. Поэтому перед разработчиками VB.NET ставились следующие цели:
38
•
VB.NET должен быть узнаваемым разработчиками Visual Basic;
•
VB.NET должен иметь простой синтаксис;
•
VB.NET должен позволять использовать основные свойства .NET Framework;
•
Глаза 2. Visual Studio.NET
• •
VB.NET должен поддерживать многоязычную среду .NET Framework; VB.NET должен обеспечить перенос существующих приложений Visual Basic 6 в среду .NET Framework;
• VB.NET должен максимально сохранить синтаксис предыдущих версий Visual Basic. Перечисленные выше цели проектирования дают разработчикам VB.NET достаточный простор для создания языка, который позволит легко разрабатывать приложения .NET.
Доступность Visual Basic, как язык программирования, был всегда доступен широкому кругу разработчиков и потенциальных разработчиков. Разработчик на Visual Basic может быстро приступить к решению своих задач и повышать свое мастерство в процессе их решения. Доступность Visual Basic является одновременно и достоинством и недостатком. Дело в том, что Visual Basic вовлек в процесс создания программ массу людей, никогда ранее не занимавшихся разработкой программного обеспечения. Одни из них освоили и стали успешно использовать Visual Basic, в то время как другие потерпели неудачу. К сожалению, Visual Basic часто имеет плохие отзывы со стороны разработчиков, которые просто не смогли в достаточной для решения их задач мере освоить этот инструмент. Ключевое свойство, которое привлекало разработчиков и потенциальных разработчиков в Visual Basic, — это та простота, с которой можно было начать разработку приложений. Существует множество причин, по которым Visual Basic стал таким доступным. Основная причина заключается в том, что синтаксис Visual Basic не отпугивает людей. Даже начинающий программист может понимать код Visual Basic. Поэтому разработчикам гораздо легче освоить язык с таким привлекательным синтаксисом, чем традиционные языки, подобные C/C++. Visual Basic, подобно другим объектно-ориентированным языкам, скрывает реализацию функциональности программы от ее интерфейса. Известно, что одной из основных идей объектно-ориентированного программирования является инкапсуляция, которая означает, что нужно представлять то, что может быть сделано, и держать в секрете, как это в действительности реализовано. Например, объект "кнопка" имеет событие "щелчок мыши". В данном случае Visual Basic скрывает обработку сообщения и цикл сообщений Windows, обеспечивающие генерацию реального события. Таким образом, Visual Basic скрывает от разработчиков внутреннюю организацию программирования для Windows. (Разумеется, опытные программисты находят способы обойти многие из этих встроенных ограничений.) Другим ключевым свойством для начинающих является возможность нетипизированного программирования, т.е. возможно объявление переменных без определения хранящихся в них типов данных. Это, фактически, позволяет переменной хранить данные любого типа. Как правило, нетипизированное программирование использовать не рекомендуется, так как оно приводит к появлению в приложениях трудно обнаруживаемых ошибок. Однако такой способ объявления переменных позволяет программистам начать разработку без изучения типов данных и способов преобразования данных из одного типа в другой. Visual Basic — это язык программирования, который можно быстро изучить и приступить к разработке приложения. При этом очень важно рассмотреть не только основные возможности языка, но и изучить правильный способ решения таких задач, как доступ к базам данных, обработка строк, управление состоянием и ресурсами. Visual Basic базируется на простоте и узнаваемости. Если корректно писать программы на Visual Basic, то код получается практически самодокументируемым. Так, Visual Basic не Visual Basic и .NET Framework
39
предусматривает использования специальных символов и операторов вместо слов и команд, за исключением тех случаев, когда операторы являются особенно распространенными и простыми. Поэтому, используя Visual Basic, легко создать код, понятный другим разработчикам. Такие языки программирования, как C/C++ и производные от них Java и С#, в большей степени полагаются на комментирование кода. Комментирование кода является хорошим способом документирования программ, но, так как код в процессе тестирования часто модифицируется, а комментарии имеют тенденцию оставаться неизменными, возникает проблема несоответствия кода и документации. В случае же, когда код является самодокументируемым, документация остается актуальной и после внесения в код изменений. Некоторым разработчикам не нравится, что программирование на Visual Basic требует ввода большего объема кода по сравнению с другими языками при решении одинаковых задач. Это одна из причин, по которой многие разработчики C/C++ считают Visual Basic "игрушечным" языком, в то время как в действительности это свойство упрощает последующую поддержку программ, написанных на Visual Basic.
Поддержка объектно-ориентированного программирования Изначально Visual Basic был объектно-ориентированным языком программирования. В том смысле, что в Visual Basic всегда применялись объекты в виде элементов управления или других компонентов, используемых при разработке. Начиная с четвертой версии, объектно-ориентированные конструкции появились и в синтаксисе Visual Basic. В следующей версии, Visual Basic 5, были добавлены новые языковые конструкции, которые расширили поддержку объектно-ориентированного программирования. Но только в VB.NET появился механизм наследования с возможностью переопределения методов в производных классах. В дополнение к возможности наследовать классы, созданные в Visual Basic, среда VB.NET позволяет наследовать классы, написанные на любом .NETсовместимом языке, включая С#, JScript.NET и C++.NET, или на другом языке, реализованном для платформы .NET Framework компанией Microsoft либо другим производителем программного обеспечения. Наследование интерфейсов, все еще являющееся ключевым для создания гибких приложений, также расширено в VB.NET. Синтаксис описания наследования интерфейсов изменился, чтобы позволить одному методу реализовать несколько интерфейсов. В VB.NET добавлено несколько новых ключевых слов, которые помогают конструировать гибкие и мощные объекты. Эти ключевые слова позволяют контролировать, как именно методы могут быть переопределены и перегружены и как методы и свойства защищаются от несанкционированного доступа. С интеграцией Visual Basic в .NET Framework наконец-то появился объектноориентированный способ получения адресов функций через специальные представители — делегаты (delegates). Делегаты являют собой весьма элегантный способ синхронизации обратных вызовов, событий и других способов управления функциями. Со всеми этими изменениями VB.NET стал полнофункциональным объектноориентированным языком с простой и понятной моделью создания .NET-приложений. Несмотря на то что большая часть синтаксиса, поддерживающего процедурный стиль программирования предыдущих версий Visual Basic, все еще доступна в VB.NET, рекомендуется при создании новых приложений и преобразовании существующего кода не использовать процедурный синтаксис, а применять современный объектно-ориентированный стиль программирования.
40
Глава 2. Visual Studio.NET
Современные языковые конструкции Хотя Visual Basic.NET поддерживает старые способы обработки ошибок, в новую версию добавлена возможность структурной обработки ошибок. Новый способ значительно упрощает и делает прозрачной обработку ошибок. В VB.NET реализована идея атрибутивного программирования, которое является частью .NET Framework. Атрибутивное программирование позволяет разработчикам обращаться к свойствам методов для контроля взаимодействия другого кода с методами. Этой обработкой кода занимается среда исполнения.
Безопасность Технология .NET Framework привнесла в VB.NET завершенную инфраструктуру создания защищенных приложений. Безопасность в предыдущих версиях Visual Basic достигалась несколькими способами, включая создание специального пользовательского кода, использование встроенных средств безопасности Windows и применение средств COM/MTS и СОМ+. В VB.NET механизмы обеспечения безопасности встроены непосредственно в среду .NET Framework. При использовании системы безопасности .NET Security (встроенная система безопасности .NET Framework) можно достаточно просто защитить данные и процессы от несанкционированного доступа в приложениях VB.NET. В VB.NET добавлено новое свойство, обеспечивающее безопасность типов. До появления VB.NET среда исполнения кода Visual Basic при управлении данными пыталась конвертировать данные какого-либо типа в любой другой тип, доступный в языке. Это автоматическое преобразование, иногда называемое программистами "злоумышленным приведением типов", может существенно усложнить отладку кода. Сейчас в VB.NET по умолчанию требуется явное приведение типов. Установка явного приведения типов может быть отключена, но это целесообразно делать только в случае переноса приложений из предыдущих версий Visual Basic или же для приложений с поздним связыванием.
Многоязычная интеграция Созданные в VB.NET классы полностью открыты к расширению и способны расширять классы, реализованные на других языках. Это значит, что классы VB.NET могут быть использованы как базовые в других языках, а также могут использовать и наследовать классы, созданные на других языках. Это позволяет разработчикам при решении специфических задач выбирать наиболее подходящий язык программирования. Так, если задача выполняет большое количество вычислений, то лучшим выбором будет язык, ориентированный на математическую обработку данных. Если же требуется интенсивная обработка строковых данных, то, естественно, лучше использовать наиболее подходящий язык для решения подобных задач.
Взаимодействие с СОМ и Windows API Компоненты VB.NET могут вызывать и использовать СОМ-компоненты. В свою очередь, СОМ-компоненты и приложения могут использовать компоненты, созданные в VB.NET. Доступ к Windows API реализован в .NET Framework с помощью встроенных классов и через знакомый разработчикам VB метод plnvoke. Хотя среда .NET Framework поддерживает различные платформы, эта технология позволяет при необходимости получить прямой доступ к самой платформе. Возможность прямого доступа к компьютерной платформе существенно отличает технологию Java от .NET Framework. Взаимодействие различных компонентов более подробно описывается в главе 12, " Взаимодействие элементов языка". Visual Basic и .NET Framework
41
Резюме Visual Studio.NET можно с уверенностью назвать наиболее значительной разработкой компании Microsoft, и вполне возможно, что эта среда является наилучшим инструментом, когда-либо созданным тем или иным производителем программного обеспечения. Программисты, имеющие опыт работы с предыдущими версиями Visual Basic, найдут новый инструмент очень удобным в использовании. Те, кто работал с Visual InterDev, также найдут новую среду разработки приложений очень знакомой. Среду Visual Studio.NET можно рассматривать как первое приложение платформы .NET Framework, так как значительная ее часть была действительно создана с использованием технологии .NET Framework.
42
Глава 2. Visual Studio.NET
Концепции объектноориентированного программирования За время своего существования Visual Basic превратился из объектного {object-based) в объектно-ориентированное (object-oriented) средство разработки. В ранних версиях Visual Basic некоторые ключевые особенности языка не были реализованы. Предыдущие версии Visual Basic позволяли программистам создавать классы и использовать их при разработке приложений. При этом основные возможности объектно-ориентированного программирования практически не учитывались. Это не мешало разработчикам создавать надежные системы, формируемые на компонентной основе, однако препятствовало созданию расширяемых конструкций. К Visual Basic.NET это не относится. Объектно-ориентированное программирование в .NET Framework фактически является необходимым условием, поэтому Visual Basic превратился в многофункциональный объектно-ориентированный язык. Новыми свойствами языка являются поддержка наследования, новые методы объявления объектов, а также возможности атрибутивного программирования. Кроме этого, в Visual Basic.NET значительно улучшена поддержка интерфейсов, свойств и событий. Объектно-ориентированное программирование имеет особое значение для создания сложных приложений. Например, в предыдущих версиях Visual Basic далеко не многие стремились к использованию объектно-ориентированных методов программирования. Подобную ошибку не следует повторять в VB.NET. Для эффективной работы в среде VB.NET разработчик должен понимать и правильно использовать ключевые концепции объектно-ориентированного программирования. Существует четыре основных понятия, относящихся к объектно-ориентированной среде разработки: абстрагирование, инкапсуляция, полиморфизм и наследование. В этой главе остановимся на каждом из них.
Абстрагирование в Visual Basic.NET Абстрагирование (abstraction) — это возможность обобщения представлений объекта в виде типа данных, имеющего определенный набор характеристик и способного выполнить какой-либо набор действий. Например, абстрагирование объекта "собака" содержит характеристики c o l o r (цвет), h e i g h t (рост) и w e i g h t (вес), а также набор действий, таких как run (бежать) и b i t e (кусать). В данном случае характеристики собаки называются свойствами {properties), а действия — методами (methods). В объектно-ориентированных языках абстрагирование обеспечивается посредством классов (classes). Классы определяют свойства и методы объекта, но старайтесь не забывать о том, что разработчик не может использовать класс непосредственно; напротив, объект должен быть создан из класса — он должен быть реализован (instantiated). В Visual Basic поддержка классов существует начиная с версии 4.0. Вплоть до появления VB.NET каждый класс был выполнен в виде отдельного файла, абстрагирующего данный объект. Примеры классов Visual Basic 6.0 и Visual Basic.NET приведены в листингах 3.1 и 3.2. В Visual Basic 6.0 класс определяется в виде файла с расширением . CLS. В языке VB.NET способ определения классов изменился — эта операция выполняется непосредственно с помощью кода. В примере, который приведен в листинге 3.2, обратите внимание на операторы P u b l i c C l a s s Car и End-Class. ЛИСТИНГ 3.1. Класс Visual Basic 6.0
Public MaximumSpeed as Integer Public ModelName as String Public Sub Accelerate() 'Код для начала движения автомобиля End Sub Public Sub StopO 'Код для остановки автомобиля End Sub ЛИСТИНГ 3.2. Класс VB.NET Public Class Car Public MaximumSpeed as Integer Public ModelName as String Public Sub Accelerate() 'Код для начала движения автомобиля End Sub Public Sub StopO 'Код для остановки автомобиля End Sub End Class В этих листингах приведен пример абстрагирования достаточно простого объекта — автомобиля. Для того чтобы воспользоваться этой абстракцией, необходимо в первую очередь создать экземпляр класса. В Visual Basic 6.0 есть несколько различных способов создания классов. В VB.NET это положение изменилось. Наиболее распространенным методом создания объекта является использование ключевого слова New. В листинге 3.3 приведены три метода создания экземпляра класса в Visual Basic 6.0, а в листинге 3.4 — четыре метода выполнения подобных операций в VB.NET. ЛИСТИНГ 3.3. Три метода создания экземпляра класса в Visual Basic 6.0
Dim oCar as New Car Set oCar = New Car Set oCar = CreateObject("Vehicles.Car") 44
Глава З. Концепции объектно-ориентированного программирования
Обратите внимание на то, что метод CreateOb j e c t в листинге 3.4 не используется. Применение этого метода ограничено только созданием классических СОМкомпонентов и не распространяется на экземпляры компонентов .NET Framework. Вместо CreateOb j e c t с успехом используется метод System. A c t i v a t o r . C r e a t e l n s t a n c e . (Методу A s s e m b l y . C r e a t e l n s t a n c e соответствует System. A c t i v a t o r .CreateInstance.) Листинг 3.4. Четыре метода создания экземпляра класса в VB.NET Dim oCar as New Car oCar = New Car oCar = Assembly.Createlnstance("Car") oCar = System.Activator.Createlnstance("Car","URIToAssembly")
Инкапсуляция B V B . N E T Объект должен скрывать детали своей реализации, открывая "внешнему миру" лишь методы и свойства. Инкапсуляция (encapsulation) представляет собой доступность свойств и методов объекта," в то время как сам объект фактически скрыт от внешнего мира. Другими словами, объект подобен "черному ящику", т.е. те разработчики, которые с ним работают, могут даже не знать о том, что в действительности происходит внутри данного объекта. Инкапсуляция позволяет разработчикам создавать объекты, которые могут быть изменены без какого-либо воздействия на использующий их клиентский код. Самое главное в том, что интерфейс (interface) объекта, т.е. набор его доступных свойств и методов, не меняется даже при изменении внутренней реализации объекта. Visual Basic поддерживает инкапсуляцию начиная с версии 4.0. Рассмотрим два простых примера. В листингах 3.5 и 3.6 представлены две реализации класса Person, выполненные двумя различными способами. ЛИСТИНГ 3.5. Первый способ реализации класса Person
Public Class Person Private m_sFirstName as String Private m_sLastName as String Public Property FirstNamef) as String Get FirstName = m_sFirstName End Get Set(ByVal Value as String) m_sFirstName = Value End Set End Property Public Property LastNameO as String Get LastName = m_sLastName End Get Set(ByVal Value as String) m_sLastName = Value End Set End Property Readonly Property FullNameO as String Get FullName = m_sLastName & ", " & m_sFirstName End Get End Property End Class
Инкапсуляция BVB.NET
45
Листинг 3.6. Второй способ реализации класса Person Public Class Person Private m_sFirstName as String Private m_sLastName as String Private m_sFullName as String Public Property FirstName() as String Get FirstName = m_sFirstName End Get Set (ByVal Value as String) m_sFirstName = Value m_sFullName = m_sLastName & ", " S m_sFirstName End~Set End Property Public Property LastNameO as String Get LastName = m_sLastName End Get Set(ByVal Value as String) m_sLastName = Value m_sFullName = m_sLastName & ", " & m_sFirstName End Set End Property Readonly Property FullNameO as String Get FullName = m_sFirstName End Get End Property End Class Приведенные примеры иллюстрируют инкапсуляцию процессов внутри класса. Несмотря на различия во внутренней реализации классов, внешний интерфейс не изменяется. Именно это и является целью инкапсуляции: позволить разработчику прозрачно использовать различные реализации одного и того же объекта.
ПолиморфизмвVB.NET Сущность полиморфизма (polymorphism) заключается в том, что разные объекты могут иметь различные реализации одной и той же характеристики. В качестве примера рассмотрим два объекта, один из которых является автомобилем Porsche 911, а Другой — Toyota Corolla. Оба объекта — автомобили; т.е. оба происходят из класса Саг и содержат метод d r i v e . Но реализации методов, как видите, могут разительно отличаться друг от друга. Судя по описанию, полиморфизм подобен инкапсуляции, но в то же время имеет некоторые существенные отличия. Инкапсуляция выражается в сокрытии внутренней реализации объекта. Полиморфизм, в свою очередь, проявляется в том, что различные классы могут иметь один и тот же интерфейс. В Visual Basic 4.0 была реализована достаточно ограниченная поддержка полиморфизма, осуществленная с помощью динамического связывания. Динамическое или позднее связывание (late binding) представляет собой определенную технологию, позволяющую определять во время выполнения кода, какие свойства и методы обеспечивает данный объект. При этом код может создавать какой-либо объект и вызывать его методы или свойства независимо от того, поддерживается ли объектом вызываемый метод во время компиляции. Если использовать два различных класса с одинаковыми свойствами и 46
Глава 3. Концепции объектно-ориентированного программирования
методами, то создавать отдельные экземпляры этого класса можно с помощью переменной типа o b j e c t . К сожалению, динамическое связывание не позволяет должным образом обеспечить безопасность типов во время компиляции. Концепция безопасности типов (type safety) гарантирует использование типов данных, соответствующих своему названию, например строковых для строк и т.д. При отсутствии механизма безопасности типов значительно возрастает количество потенциальных ошибок, возникающих при выполнении программы до завершения ее компиляции. Кроме этого, безопасность типов позволяет предотвратить взлом программ, используя некорректный фрагмент кода. В Visual Basic 5.0 появилась дополнительная форма полиморфизма, позволяющая использовать интерфейсы. Интерфейс (interface) определяет набор свойств, методов и событий, реализуемых данным классом. Один и тот же интерфейс может быть реализован одновременно несколькими классами. Переменная, определяющая значение интерфейса, может ссылаться на любой класс, реализующий данный интерфейс. Интерфейсы обеспечивают раннее связывание с объектом, что позволяет значительно повысить эффективность, а также обеспечить защиту типов во время компиляции. Интерфейсы являются одной из наиболее важных особенностей Visual Basic 5.0, правда, все еще наименее изученной и мало используемой. В VB.NET существенно улучшена поддержка интерфейсов. В настоящее время язык имеет прямую поддержку создания интерфейсов, что в более ранних версиях осуществлялось либо с помощью языка описания интерфейсов (IDL), либо путем создания пустых классов. Кроме того, какой-либо один метод может быть реализацией методов сразу нескольких интерфейсов. В листинге 3.7 приведен пример полиморфизма, реализованного с помощью динамического (или позднего) связывания, а в листинге 3.8 — с помощью раннего связывания. В том и другом примере показаны классы, реализующие методы Ride. Как видите, в обоих случаях метод может вызывать метод любого класса независимо от того, каким из объектов он используется. Именно в этом и состоит сущность полиморфизма: возможность создания кода, который использует различные объекты, реализующие один и тот же интерфейс. ЛИСТИНГ 3.7. Полиморфизм, реализованный с помощью позднего связывания
Public Class RollerCoaster Public Sub Ride() Console.WriteLine("Here we go") Console.WriteLine("Click, Click ,Click") Console .WriteLine ("Oh, *&@%") Console.WriteLine ( "That was great") End Sub End Class Public Class MerryGoRound Public Sub RideO Console.WriteLine("OK will go on it") Console.Writeline("Nap Time") Console.WriteLine("Yea its over") End Sub End Class Приведенный ниже код расположен в программе. Private Sub DayAtTheAmusementPark() Dim oRollerCoaster as New RollerCoaster Dim oMerryGoRound as New MerryGoRound Call GoOnRide(oRollerCoaster) Call GoOnRide(oMerryGoRound) End Sub
Полиморфизм в VB.NET
47
Private Sub GoOnRide(oRide as Object) oRide.RideO End Sub В данном случае предпочтительнее использовать раннее связывание, так как оно способствует повышению эффективности и позволяет находить ошибки, возникающие во время компиляции. Раннее связывание может быть реализовано с помощью интерфейсов, как показано в листинге 3.8. Листинг 3.8. Полиморфизм, реализованный с помощью интерфейсов Public Interface IAmusementParkRide Sub Ride() End Interface Public Class RollerCoaster Implements IAmusementParkRide Public Sub IAmusementParkRide_Ride() Console.WriteLine("Here we go") Console.WriteLine("Click, Click .Click") Console.WriteLine("Oh, *&@%") Console.WriteLine("That was great") End Sub End Class Public Class MerryGoRound Implements IAmusementParkRide Public Sub IAmusementParkRide_Ride() Console.WriteLine("OK will go on it") Console.Writeline("Nap Time") Console.WriteLine("Yea its over") End Sub End Class Следующий код находится где-то в программе: Private Sub DayAtTheAmusementPark() Dim oRollerCoaster as New RollerCoaster Dim oMerryGoRound as New MerryGoRound Call GoOnRide(oRollerCoaster) Call GoOnRide(OMerryGoRound) End Sub Private Sub GoOnRide(oRide as IAmusementParkRide) oRide.Ride() End Sub
Наследование в VB.NET Сущность наследования выражается в том, что один класс, называемый подклассом (или дочерним классом), может быть создан на основе другого класса, который, в свою очередь, называется базовым (или родительским) классом. Наследование обеспечивает механизм для создания иерархий объектов. Например, собака (dog) принадлежит классу млекопитающих (mammal), а колли ( c o l l i e ) является представителем класса собак. Таким образом, класс dog наследует свойства и методы класса mammal, а класс c o l l i e , соответственно, наследует свойства и методы классов dog и mammal. В объектно-ориентированном языке существует два типа связей между объектами иерархии — HasA (имеет) и IsA (является). Например, колли IsA собакой и HasA хвост. Реализация наследования является объектно-ориентированным свойством, поддерживающим связи типа IsA, и представляет собой еще один способ, используемый в VB.NET для 48
Глава 3. Концепции объектно-ориентированного программирования
поддержки полиморфизма. Функция может принимать параметр mammal, после чего объект, порожденный из класса mammal, так же как и параметр, может быть передан данной функции.
Реализация наследования Идея об использовании существующего класса в качестве отправной точки при формировании нового класса не могла быть реализована в ранних версиях Visual Basic. И только начиная с пятой версии Visual Basic поддерживает наследование интерфейса посредством ключевого слова implements. Подобная возможность в языке программирования называется реализацией наследования (implementation inheritance). В настоящее время это одна из дополнительных возможностей VB.NET. Предыдущие версии Visual Basic были предназначены для разработки СОМприложений, что являлось препятствием для использования реализации наследования. Visual Basic.NET, в свою очередь, предназначен непосредственно для среды .NET Framework, в основе которой лежит эта возможность. Поддержка реализации наследования является, по всей вероятности, наиболее существенным изменением, внесенным в Visual Basic.NET. В табл. 3.1 приведены новые ключевые слова, введенные в язык вместе с новыми операторами и методами.
Таблица 3.1. Новые элементы языка, относящиеся к реализации наследования Элемент
Контекст
Описание
Inherits
Оператор класса
Указывает класс, из которого наследуется новый класс
Notlnheritabie
Оператор класса
Указывает, что данный класс не может быть унаследован из другого класса
Mustlnherit
Оператор класса
Указывает класс, который должен быть унаследован другим классом
Overridable
Процедура
Указывает процедуру, которая может быть отменена подклассом
NotOverridable
Процедура
Указывает процедуру, которая не может быть отменена в подклассе
MustOverride
Процедура
Указывает процедуру, которая должна быть отменена в подклассе
Overrides
Процедура
Указывает, что данная процедура отменяет процедуру в базовом классе
MyBase
Код
Позволяет коду в классе вызывать код в базовом классе
MyClass
Код
Позволяет коду в классе вызывать код непосредственно
Protected
Функция, процедура, поле, свойство
Указывает, что код в дочернем классе может получить доступ к данному объекту
В примере, который приведен в листинге 3.9, используется целый ряд новых ключевых слов. Код описывает класс с четырьмя свойствами и одним методом. Какой-либо класс, который наследуется из данного класса, должен отменить свойство ClassName. Но свойство BaseClassName не может быть отменено ни одним из дочерних классов. Все остальные свойства и методы могут произвольно отменяться классами, которые наследуются из родительского.
Наследование в VB.NET
49
Листинг 3.9. Класс Person Public Class Person Protected c_sFirstName as String Protected c_sLastName as String MustOverride Readonly Property ClassNameO as String Get ClassName = "Person" End Get End Property NotOverridable Readonly Property BaseClassName() as String Get BaseClassName = "Person" End Get . End Property Overidable Public Property FirstNameO as String Get FirstName = c_sFirstName End Get Set(ByVal Value as string) c_sFirstName = Value End Set End Property Overidable Public Property LastNameO as String Get LastName = c_sLastName End Get Set(ByVal Value as string) c_sLastName = Value End Set End Property Overridable Sub Speak() Console.WriteLine("I am " & c_sFirstName & " " S c_sLastName) Console.WriteLine(" and I am a Person.") End Sub End Class
Этот пример иллюстрирует реализацию наследования в языке VB.NET. Языковые конструкции, согласно основным требованиям Visual Basic, должны быть просты и понятны. В табл. 3.2 сравниваются некоторые ключевые слова, используемые в VB.NET для управления доступностью классов и членов класса, с их эквивалентами в языке С#. Не правда ли, ключевые слова VB.NET более понятны, чем аналогичные ключевые слова языка С#? Таблица 3.2. Ключевые слова языков Visual Basic и С# VB.NET Notlnheritabie
С# Sealed
Mustlnherit
Abstract
MustOverride
Virtual
Inherits
:
Код, приведенный в листинге 3.10, описывает класс, который наследуется из класса Person.
50
Глава 3. Концепции объектно-ориентированного программирования
Листинг 3.10. Класс NewPerson Public Class NewPerson Inherits Person MustOverride Overrides Public Readonly Property ClassNameO as String Get ClassName = "NewPerson" End Get End Property Overrides Sub Speak() Console.WriteLine("My name is " S c_sFirstName S " " & c_sLastName) Console.WriteLine(" and I am a new person.") End Sub End Public При описании этого класса используется целый ряд новых ключевых слов. Например, слово I n h e r i t s указывает на то, что данный класс наследуется. Свойству доступности ClassName присвоены значения M u s t O v e r r i d e и P u b l i c , указывающие на то, что любой дочерний класс, наследуемый из этого класса, должен отменить данное свойство. Ключевое слово O v e r r i d e s указывает, что свойство ClassName и метод Speak родительского класса отменяются новым классом. Свойства c_sFirstName и c_sLastName в новом классе не определены. Эти свойства были определены в родительском классе, а доступности свойств было присвоено значение p r o t e c t e d . Более подробно модификаторы доступности описываются в главе 4, "Методы, свойства, события". I
Эффективная реализация наследования Анализ и проектирование имеют первостепенное значение для эффективного решения с использованием реализации наследования. Одно из главных требований— ясность и простота реализации основных концепций разработки, поэтому в VB.NET поддерживается стремление разработчиков уделить проектированию больше времени. Для того чтобы разрешить наследование каких-либо методов и свойств, пометьте их в родительском классе как O v e r r i d a b l e . Те методы, которые будут отменены при наследовании из основного класса, должны быть отмечены ключевым словом O v e r r i d e s . И наконец, если из данного класса не может быть унаследован какой-либо другой класс, он должен быть отмечен как N o t l n h e r i t a b l e . Требование четкой реализации замысла проекта, предъявляемое к разработчику, позволяет решить проблему "недостаточности базового класса". Рассмотрим пример: в базовый класс вводится новый метод, имеющий то же имя, что и метод производного класса. Метод дочернего класса не был предназначен для отмены метода родительского класса, но в данном случае произошло именно это. Такая ситуация может привести к проблеме, связанной с использованием класса на уровне клиента. Требования декларативного синтаксиса предупреждают появление подобной проблемы BVB.NET.
Включение Как уже указывалось, включение является механизмом осуществления связей HasA (имеет). Этот механизм достаточно прост и не требует поддержки каких-либо элементов языка. В языке Visual Basic для создания связи HasA достаточно одному из Наследование в VB.NET
51
объектов содержать в себе экземпляр другого объекта. Например, для того чтобы в классе P e r s o n определить связь типа HasA с собакой, следует всего лишь ввести код из листинга 3.11. • .
.
Листинг 3.11. Включение, иллюстрирующее связи HasA Private c_oDog as Dog Public Property MyDog() as Dog Get MyDog = c_oDog End Get End Property Public Sub GetADog(ByVal Breed as String, ByVal Name as String) c_oDog = New Dog(Breed,Name) End Sub
Программирование интерфейсов Решения на основе компонентов имеют как положительные, так и отрицательные стороны. Одним из основных преимуществ является возможность создания приложений "по частям". Идея такова: разработка программного обеспечения может выполняться по тем же принципам, что и изготовление каких-либо промышленных образцов, т.е. система создается в виде нескольких отдельных компонентов вместо единой монолитной конструкции. Звучит заманчиво, но, подобно большинству грандиозных проектов, об этом легче сказать, чем сделать. В частности, это относится к более ранним версиям Visual Basic. Теоретически можно взять компонент, который выполняет те или иные действия, и заменить его другим, выполняющим те же действия. К сожалению, чаще всего этого не происходит. В чем же причина? Чтобы улучшить качество функционирования, разработчики предпочитают использовать ранее связывание, что позволяет им связывать компоненты во время компиляции. В свою очередь, для того чтобы воспользоваться ранним связыванием, следует явно определить указанные компоненты, что приводит к созданию конструкции с высокой степенью интеграции компонентов. В конечном итоге это приводит к появлению длинной цепи повторных компиляций. Незначительное изменение одного компонента требует повторной компиляции всех зависящих от него компонентов, а также компонентов, зависящих от этих компонентов, и т.д. В Visual Basic 5.0 появилась возможность хранить определение интерфейса отдельно от компонента, реализующего данный интерфейс. Поэтому необходимость создания зависимых компонентов исчезает. В этом случае для создания экземпляра какого-либо класса достаточно сослаться не на указанный класс, а на интерфейс, реализованный данным классом. Подобная технология позволяет разработчику постоянно изменять фактически используемый компонент. Это особенно важно в том случае, когда компонент и код, его использующий, разрабатываются одновременно. Например, на ранних стадиях разработки может использоваться достаточно простая реализация компонента. Несколько позже можно подключать его более сложную реализацию. А после завершения разработки первоначальная реализация компонента может быть с успехом заменена совершенно другой. Интерфейсы облегчают весь процесс разработки программного обеспечения. С их помощью можно проанализировать элементы созданного проекта, а также значительно упростить сопровождение и выполнение приложений. Интерфейсы чем-то похожи на автомобильные шины. Скажите, трудно ли вам использовать для автомобиля шины только одной марки, типа и стоимости? 52
Глава 3, Концепции объектно-ориентированного программирования
Изменения интерфейсов BVB.NET Расширение возможностей языка VB.NET коснулось и интерфейсов. В настоящее время, например, событие может быть частью интерфейса, что является одним из наиболее существенных дополнений. (В предыдущих версиях Visual Basic существовало только позднее связывание событий.) Механизм определения интерфейса также был изменен. В предыдущих версиях Visual Basic интерфейсы могли быть созданы с помощью класса или же с помощью средств языка описания интерфейсов (IDL). В листинге 3.12 приведен пример нового синтаксиса интерфейса, содержащего событие. Это достаточно простой пример. Но несмотря на это, понятно, что определение интерфейса в языке VB.NET выполняется по тем же законам, что и в языке Visual Basic. Листинг 3.12. Определение интерфейса в VB.NET Public Interface IEmployee Property FirstNamet) As String Property LastNameO As String Function ChangeSalary(ByVal Percentagelncrease as Decimal) mal Event Fired(ByVal ReasonCode as Integer) End Interface
as Deci-
Интерфейсы в VB.NET имеют ряд других улучшений, к которым относится и наследование. Как только интерфейс создается, он может быть реализован в любом из языков платформы .NET Framework. Для реализация интерфейса в среде VB.NET можно воспользоваться методом Visual Basic 5.0 или же новым методом из VB.NET. В листинге 3.13 приведен пример реализации интерфейса в Visual Basic версий 5.0 или 6.0, а в листинге 3.14 — пример создания интерфейса в VB.NET. Листинг3.13. Реализация интерфейса в Visual Basic 6.0 Public Class Employee Implements IEmployee Private c_sFirstName as String Private c_sLastName as String Private c_dSalary as Decimal Private Property IEmployee_FirstName() as String Get IEmployee_FirstName = c_sFirstName End Get Set(ByVal Value as String) c_sFirstName = value End~Set End Property Private Property IEmployee_LastName() as String Get IEmployee_LastName = c_sLastName End Get Set(ByVal Value as String) c_sLastName — value End~Set End Property Private Function IEmployee_ChangeSalary_ (ByVal Percentagelncrease as Decimal) as Decimal Return c_dSalary * (Percentagelncrease / 100) End Function
Программирование интерфейсов
53
'В этом фрагменте не реализовано событие 'Это можно сделать, но код будет достаточно сложным End Class
Синтаксис VB.NET, используемый для реализации интерфейсов, более гибок, прост и понятен (см. листинг 3.14). Листинг 3.14. Реализация интерфейса в стиле VB.NET Public Class Employee Implements IEmployee Private c_sFirstName as String Private c_sLastName as String Private c_dSalary as Decimal Public Property FirstNameofEmployee() as String Implements IEmployee.FirstName Get IEmployee_FirstName = c_sFirstName End Get Set(ByVal Value as String) c_sFirstName = value End~Set End Property Public Property LastNameOfEmployee() as String Implements IEmployee.LastName Get IEmployee_LastName = c_sLastName End Get Set(ByVal Value as String) c_sLastName = value End Set End Property Private Function UpdateSalary(ByVal Percentagelncrease as as Decimal Implements IEmployee.ChangeSalary Return c_dSalary * (Percentagelncrease / 100) End Function "В этом фрагменте не реализовано событие 'Это можно сделать, но код будет достаточно сложным End Class
Decimal)
Новый стиль гораздо более гибок. Например, один класс может реализовать несколько интерфейсов, после чего можно использовать только один метод для его реализации во всех интерфейсах сразу. Реализация методов в языках Visual Basic 5.0 и 6.0 приведена в листингах 3.15 и 3.16. В листингах 3.17 и 3.18 приведен код подобных операций в VB.NET. Листинг 3.15. Реализация метода iEmployee в Visual Basic 5.0 или 6.0 Private Function IEmployee_ChangeSalary() As Decimal Return c_dSalary * (Percentagelncrease / 100) End Function
В листинге 3.16 реализуется дополнительный интерфейс в том же классе и делегируются функциональные возможности предыдущего интерфейса. Листинг 3.16. Реализация методов IEmployee и 1Етр1оуее2 в Visual Basic 5.0 или 6.0 Private Function IEmployee ChangeSalary_ (ByVal Percentagelncrease as Decimal) As Decimal Return c_dSalary * (Percentagelncrease / 100) End Function 54
Глава З. Концепции объектно-ориентированного программирования
Private Function IEmployee2_ChangeSalary_ (ByVal Percentagelncrease as Decimal) As Decimal Return IEmployee_ChangeSalary(Percentagelncrease) End Function В языке VB.NET подобная операция выполняется гораздо проще: следует всего лишь изменить существующие методы реализации предложения (см. листинг 3.17). Листинг 3.17. Реализация метода lEmployee в VB.NET Private Function UpdateSalary(ByVal PercentageToChange as Decimal) as Decimal Implements lEmployee.ChangeSalary Return c_dSalary * (PercentageToChange / 100) End Function VB.NET позволяет добавить к объявлению функции небольшой фрагмент дополнительного кода, указывающего, что данная функция также является реализацией метода IEmployee2 .ChangeSalary (см. листинг 3.18). Листинг 3.18. Реализация методов lEmployee и IEmployee2 в VB.NET Private Function UpdateSalary((ByVal PercentageToChange as Decimal) as Decimal Implements lEmployee.ChangeSalary, IEmployee2.ChangeSalary Return c_dSalary * (PercentageToChange / 100) End Function
Резюме В VB.NET существенно обновлены объектно-ориентированные возможности. Знакомство с VB.NET и со средой .NET Framework связано в основном с изучением новых объектно-ориентированных особенностей языка. Разработчику придется в обязательном порядке потратить некоторое время на освоение многочисленных способов корректного использования описанных средств. С ростом возможностей появляется чувство ответственности, поэтому старайтесь использовать новые возможности разумно. Будьте готовы к исправлению ошибок, которые будут сопровождать первые попытки. В этой главе рассмотрена лишь верхушка "объектно-ориентированного айсберга". Как показывает практика, 80% времени, приходящегося на изучение среды .NET Framework, уходит на освоение ее составных частей. Кроме этого, первостепенную роль играет изучение способов архитектурной реализации.
Резюме
55
ГЛАВА / Методы, свойства, события Классы состоят из методов, свойств и событий. Методы (methods) используются для выполнения действий над объектом; свойства (properties) обеспечивают доступ к данным объекта; события (events) представляют собой реакцию объекта на действия системы, пользователя или других приложений. Методы, свойства и события использовались, конечно, и в предыдущих версиях Visual Basic, но в VB.NET они позволяют обеспечить более широкие функциональные возможности.
Методы Методы представляют собой действия, выполняемые объектом. В Visual Basic существует два типа методов: процедуры и функции. Процедуры и функции классов VB.NET практически ничем не отличаются от подобных процедур и функций Visual Basic. Но следует подчеркнуть, что VB.NET внес несколько неуловимых на первый взгляд изменений.
Изменения параметров Как вы знаете, ключевые слова ByRef и ByVal определяют способ передачи параметров. Теперь вместо ключевого слова ByRef, задаваемого при объявлении аргументов, по умолчанию используется ByVal. При преобразовании приложений, созданных в предыдущих версиях Visual Basic, в том случае, когда это необходимо, следует явно указывать ByRef. VB.NET все еще поддерживает необязательные параметры. Несмотря на это, при объявлении таких параметров им следует задать значения по умолчанию. Кроме этого, в VB.NET не поддерживается функция I sMi s s ing. В языке VB.NET свойства могут быть переданы как в процедуру, так и из нее. Пример описанных изменений приведен в листинге 4.1. В этом примере показано, как изменяется свойство объекта FirstName. Подобная операция не могла быть выполнена в Visual Basic 6.0.
Листинг 4.1. Параметр свойства ByRef Public Sub.ChangeName(ByRef Name as String) Name = "Mr. " & Name End Sub 'Код, использующий эту функцию Call ChangeName(oEmployee.FirstName)
Вызов процедуры Теперь для вызова процедуры или функции в VB.NET следует заключить объявляемый аргумент данной процедуры (или функции) в круглые скобки. Ниже приведены два способа вызова процедуры: первый вызов разрешен в Visual Basic 6.0, но не допустим более в VB.NET; второй содержит синтаксис процедуры, допустимый в VB.NET. ChangeName sFirstName ChangeName (sFirstName)
Возврат значений В предыдущих версиях Visual Basic возвращаемое значение, как показано в листинге 4.2, присваивалось имени функции. Подобный способ допустим также и в VB.NET, но лучше применять синтаксис функции, в котором используется новый возвращающий значение оператор Return. Синтаксис оператора Return приведен в листинге 4.3. ЛИСТИНГ 4.2. Возврат значения в Visual Basic 6.0
Public Function MyFunction() as String MyFunction = "Hello World" End Function Оператор R e t u r n возвращает значение, определяемое именованной переменной, константой или функцией, которая является параметром (как показано в листинге 4.3). Обратите внимание, что какой-либо код, следующий после оператора возврата, не выполняется. Это одно из отличий от Visual Basic 6.0, в котором происходит дальнейшее выполнение кода. Листинг 4.3. Возврат значения в VB.NET Public Function MyFunction() as String Return "ReturnValue" End Function В листинге 4.4 приведена методика, обычно применяемая в Visual Basic 6.0, которая не будет работать при использовании оператора Return. Листинг 4.4. Инициализация возвращаемого функцией значения Public Function MyFunction(ByVal SomeFlag as Boolean) as String MyFunction = "One Value" 'Установка возвращаемого значения по умолчанию If SomeFlag then MyFunction = "Another Value" 'Установка нового значения End If End Function Если вы попытаетесь выполнить эту операцию в VB.NET, используя оператор Return, результат будет совершенно другим (листинг 4.5). 58
Глава 4. Методы, свойства, события
Листинг 4.5. Оператор Return прекращает выполнение функции Public Function MyFunction(ByVal SomeFlag as Boolean) as String Return "One Value" 'Только этот код работает If SomeFlag then MyFunction = "Another Value" 'Установка нового значения End If End Function
Статические процедуры Переменные S t a t i c используются для хранения значений между вызовами. Процедура, объявленная в предыдущих версиях Visual Basic как S t a t i c , означает, что все ее переменные также объявлены как S t a t i c . Этот метод в VB.NET больше не используется.
Общедоступные методы Сейчас стало возможным объявить процедуру, которая может использоваться как с экземпляром создаваемого класса, так и без него. Для этого следует объявить данную процедуру как Shared. Пример объявления общедоступного метода приведен в листинге 4.6. Листинг 4.6. Общедоступный метод в VB.NET Public Class Employee Public Shared Sub AddEmployee(ByVal FirstName as String, ByVal LastName as String, ByVal Department as String, ByVal SSN as String) 'Код, сохраняющий новую учетную запись пользователя в базе данных End Sub End Class Общедоступные методы могут быть вызваны из экземпляра класса или непосредственно из класса. Приведем пример вызова с помощью экземпляра класса: Dim oEmployee as New Employee)) oEmployee.AddEmployee("Fred","Flinstone",,"Rock Breaking","111111111") И непосредственно через класс: Employee.AddEmployee("Fred","Flinstone","Rock Breaking","111111111")
Перегрузка функции Перегрузка позволяет разработчику определить несколько функций с одинаковым именем, но с разными параметрами. Списки параметров могут содержать одинаковое или разное число параметров, которые, в свою очередь, могут быть как одного, так и разных типов. На основании списка параметров компилятор определяет во время компиляции, какая из версий данной функции должна быть вызвана. В том случае, если функция возвращает какое-либо значение, типы данных списка параметров и возвращаемый тип образуют сигнатуру (signature). В листинге 4.7 приведен пример двух функций, выполняющих совершенно разные действия, но имеющих одну и ту же сигнатуру. ЛИСТИНГ 4.7. Сигнатуры функций
Public Function FunctionOne(ByVal companyName as String, ByVal companylD as Integer) as String End Function Public Function FunctionTwo.(ByVal firstName as String,
Перегрузка функции
59
ByVal employeeID as Integer) End Function
as String
Перегрузка функций является мощным средством, позволяющим создавать во время проектирования достаточно гибкие конструкции. Пример перегрузки функций приведен в листинге 4.8 (обратите внимание, что функции имеют одинаковое имя, но разные сигнатуры). В языке VB.NET необходимо явно объявить перегрузку функций, используя ключевое слово O v e r l o a d s . Листинг 4.8. Перегрузка функции Public Overloads Function AddValues(ByVal Valuel as Integer, ByVal Value2 as Integer) As Integer Return Valuel + Value2 End Function Public Overloads Function AddValues(ByVal Valuel as Integer, ByVal Value2 as Integer, ByVal Value3 as Integer) as Integer Return Valuel + Value2 + Value3 End Function
Свойства В VB.NET существуют различные методы объявления данных классов для внешнего использования. Наиболее простой — создание полей P u b l i c : P u b l i c FirstName as S t r i n g Лучше не использовать открытые поля по многим причинам. Прежде всего это препятствует управлению доступа к данным, а также проверке правильности данных с помощью кода. Рассмотрим следующую ситуацию: вместо FirstName есть поле, которое содержит элемент ItemCount из базы данных. Для того чтобы воспользоваться данными поля ItemCount, следует в первую очередь выполнить поиск в базе данных, что влечет за собой написание дополнительного кода. В результате приходится выполнять больший объем работы, а также создавать доступ к базе данных, который, возможно, никогда не будет использован. Значение ItemCount может быть реализовано как свойство, что позволяет извлекать информацию из базы данных только по мере необходимости. Кроме того, значения, объявленные как свойства, позволяют ограничивать число пользователей, имеющих к ним доступ. Свойства в VB.NET остались неизменными, но синтаксис свойств изменился, став проще и понятнее. В листинге 4.9 приведен пример определения свойств в предыдущих версиях Visual Basic. Листинг 4.9. Процедуры-свойства в Visual Basic 4.0-6.0 Public Property Let FirstName(ByVal Value as String) c_sFirstName — Value End Property
Public Property Get FirstName() FirstName = c_sFirstName End Property
as String
Если свойство является объектом, используется процедура P r o p e r t y Set вместо P r o p e r t y Let. Обратите внимание, что процедуры P r o p e r t y Get и P r o p e r t y Let (или Set) обрабатываются, как два независимых блока. При отсутствии оператора P r o p e r t y 60
Глава 4. Методы, свойства, события
Let свойство будет применимо только для чтения, а при отсутствии оператора P r o p e r t y Get — только для записи. Синтаксис описанных процедур в VB.NET существенно изменился. В листинге 4.10 приведен пример определения свойств в языке VB.NET. Листинг4.10. Определение свойств в VB.NET Private c_sFirstName as string Public Property FirstNameO as String Get Return c_sFirstName End Get Set(ByVal Value as string) c_sFirstName = Value End Set End Property Обратите внимание, что весь код представляет собой монолитный блок, который не разбивается на отдельные независимые фрагменты. Для создания свойств только для чтения или только для записи необходимо явно отметить указанные свойства как Read-Only или Write-Only. (Процедуры P r o p e r t y Get и P r o p e r t y Let, позволяющие создавать различные уровни доступа, в языке VB.NET больше не используются.) В листинге 4.11 приведен пример определения свойства Read-Only, а в листинге 4.12 — Write-Only. Листинг 4.11. Свойство Read-Only Private c_sFirstName as string Public Readonly Property FirstNameO as String Get Return c_sFirstName End Get End Property
Листинг 4.12. Свойство Write-Only Private c_sFirstName as string Public WriteOnly Property FirstNameO as String Set(ByVal Value as String) с sFirstName = Value End Set End Property
Было внесено еще одно небольшое изменение, относящееся к свойствам VB.NET. В предыдущих версиях, например, для создания заданных по умолчанию свойств использовалось довольно "странное" диалоговое окно. Теперь появился модификатор D e f a u l t , позволяющий создавать свойства по умолчанию (листинг 4.13). Существует одно важное отличие: заданное по умолчанию свойство должно содержать индекс, поэтому значения по умолчанию могут быть присвоены только некоторым типам массивов или коллекций. Листинг4.13. Свойство Default в VB.NET Public Default Property ChildrenNames(ByVal Index as Integer) as String Get Return c_sChildren(Index) End Get Set(ByVal Value as String) c_sChildren(Index) = Value End Set End Property
Свойства
61
Общедоступные свойства Разработчикам иногда приходится создавать поля и свойства, имеющие одинаковое значение для всех экземпляров класса. В предыдущих версиях Visual Basic для выполнения этой задачи существовал только один способ, состоящий в использовании модулей. Эта технология достаточно часто приводила к побочным эффектам. Подобные функциональные возможности в VB.NET обеспечиваются непосредственно в классах, для чего поле или свойство класса объявляется как общедоступное — Shared. В листинге 4.14 приведен пример класса, имеющего общее свойство. Листинг 4.14. Пример свойства Shared Public Class Employee Public Shared EmployeeCount as I n t e g e r Private m_sFirstName as String P r i v a t e m_iEmployeeID as Integer P r i v a t e Sub New(ByVal EmployeelD as Integer) 'Получение информации из базы данных и сохранение ее в переменной m_iEmployeeID = EmployeelD EmployeeCount = EmployeeCount + 1 End Sub Public Property FirstNameO as S t r i n g Get FirstName = m_sFirstName End Get Set(ByVal Value as String) m sFirstName = Value End~Set End Property Public Readonly Property EmployeelD() as Integer Get EmployeelD = m_iEmployeeID End Get End Property 'Следующая процедура взята из предыдущего примера Public Shared Sub AddEmployee(ByVal FirstName as S t r i n g , _ ByVal LastName as S t r i n g , ByVal Department as S t r i n g , _ ByVal SSN as String) 'Код, сохраняющий новую учетную запись пользователя в базе данных End Sub End Class
Общедоступные свойства, как и общедоступные методы, могут быть вызваны без создания экземпляра класса, как показано в листинге 4.15. Листинг 4.15. Использование общедоступного свойства без создания экземпляра класса Dim iEmployeeCount as Integer iEmployeeCount = Employee.EmployeeCount
Пример общедоступного свойства, вызываемого с помощью созданного экземпляра класса, приведен в листинге 4.16.
Листинг 4.16. Использование общедоступного свойства посредством экземпляра класса Dim oEmployee as New Employee(123) Dim iEmployeeCount as I n t e g e r iEmployeeCount = oEmployee.EmployeeCount
Общедоступные свойства представляют собой достаточно мощный механизм. Например, можно изменить код листинга 4.16 таким образом, чтобы использовать при первой не62
Глава 4. Методы, свойства, события
обходимости для загрузки поля EmployeeCount не общедоступное поле, а общедоступное свойство. Пример такого общедоступного свойства приведен в листинге 4.17. Одно и то же закрытое поле совместно используется всеми экземплярами класса для хранения значения EmployeeCount. Другими словами, при обращении к свойству EmployeeCount из любого экземпляра класса Employee будет возвращено одно и то же значение. Более того, можно извлечь значение только с помощью класса, т.е. без создания экземпляров данного класса. Листинг 4.17. Поиск в базе данных Public Class Employee Private Shared c_iEmployeeCount As Integer Private c_sFirstName As String Private с iEmployeelD As Integer Private Sub New(ByVal EmployeelD As Integer) 'Получение информации из базы данных и сохранение ее в переменной c_iEmployeeID = EraployeelD End Sub Public Property FirstNameO As String Get FirstName = с sFirstName End Get Set(ByVal Value As String) c_sFirstName = Value End Set End Property Public Readonly Property EmployeelD() As Integer Get EmployeelD = c_iEmployeeID End Get End Property 'Получение числа сотрудников тогда, когда это необходимо Public Shared Readonly Property EmployeeCount() As Integer Get If c_iEmployeeCount = -1 Then 'Извлечение из базы данных числа сотрудников 'и сохранение в общедоступном поле c_iEmployeeCount = CountRetreivedFromDatabase End If Return c_iEmployeeCount End Get End Property 1 Следующая процедура взята из предыдущего примера Public Shared Sub AddEmployee(ByVal FirstName As String,_ ByVal LastName As String, ByVal Department As String,_ ByVal SSN As String) 'Код, сохраняющий новую учетную запись пользователя в базе данных c_iEmployeeCount = c_iEmployeeCount + 1 End Sub End Class
События События играют центральную роль при разработке приложений. События происходят, например, при воздействии на элементы управления формы (скажем, при щелчке на кнопке) и являются в данном случае реакцией на внешнее воздействие со стороны польСобытия
63
зователя. Кроме этого, события могут использоваться для обращения к какой-либо программе с уведомлением об изменении состояния объекта. В многопоточной среде, например .NET Framework, событием является передача сообщения о завершении задачи одного из потоков. Visual Basic ввел мир Windows в программирование на основе событий; это именно то, от чего следовало бы избавиться в первую очередь. Кроме этого, в ранних версиях существовали определенные проблемы реализации событий. Возможности событий в .NET Framework были расширены, что позволило решить некоторые проблемы, а также значительно улучшить управление событиями. Определяющим в этих улучшениях является концепция делегатов.
Делегаты Теперь модель события в Visual Basic.NET выполнена на основе концепции делегатов. Делегат (delegate) — это объект, который может вызывать объектные методы. Делегат может быть представлен в виде указателей функции, обеспечивающих типовую безопасность. Процесс создания делегатов вручную в VB.NET достаточно прост (листинг 4.18). ЛИСТИНГ 4.18. Пример делегата Delegate Function MyCompareDelegate(ByVal x As I n t e g e r , ByVal у As I n t e g e r ) As Boolean Sub MySub(ByVal MyDelegate as MyCompareDelegate) MyDelegate.Invoke(5,3) End Sub Function CompareLow(ByVal X as I n t e g e r , ByVal Y as I n t e g e r ) as Boolean If X > Y then Return True Else Return False End If End Function Function CompareHigh(ByVal X as I n t e g e r , ByVal Y as I n t e g e r ) as Boolean > If X < Y then Return True Else Return F a l s e End I f End Function Sub Main() Call MySub(AddressOf Me.CompareLow) Call MySub(AddressOf Me.CompareHigh) End Sub
В большинстве случаев вручную создавать делегаты не нужно — все сделает VB.NET. Класс делегата, называемый <EventName>EventHandler, позволяет неявно определить оператор Event. Класс делегата является вложенным классом по отношению к тому классу, в котором содержится оператор Event. Сигнатура класса практически ничем не отличается от сигнатуры события.
Обработчики событий В предыдущих версиях Visual Basic существовал только один способ создания обработчика событий — разработка процедуры, синтаксис которой приведен в листинге 4.19. 64
Глава 4. Методы, свойства, события
Листинг 4.19. Синтаксис обработчика события в предыдущих версиях Visual Basic ObjectName_EventName(Event Parameters) Например, событие, происходящее при щелчке мышью на кнопке, которой присваивалось имя B u t t o n l , определялось как событие B u t t o n l _ C l i c k . Синтаксис событий в среде .NET Framework и определяется так: SuB EventHandlerNaine(ByVal sender As Object, ByVal e As System.EventArgs) Handles Object.Event В предыдущих версиях Visual Basic параметры событий передавались явно. В .NET Framework параметры включены во второй параметр, который фактически представляет собой коллекцию. В листинге 4.20 приведен пример обработчика события Form MouseDown приложения Windows Form. Класс System. EventArgs является подклассом, который вводит значения координат X и Y, а также свойства кнопки, позволяющие обеспечить функциональные возможности мыши. Листинг 4.20. Обработчик событий Form MouseDovm P u b l i c Sub Forml_MouseDown(ByVal sender As Object, ByVal e As System.Windows Forms.MouseEventArgs) Dim Button As system.Windows Forms.MouseButtons Dim X As I n t e g e r Dim Y As Integer Button = e.Button X = e.X Y = e.Y End Sub В VB.NET существует несколько методов, используемых для назначения обработчиков событий. Например, добавлено ключевое слово Handles, позволяющее назначать обработчики событий во время разработки. Как показано в листинге 4.21, Handles позволяет обрабатывать несколько различных событий с помощью одного обработчика. Обратите внимание, что для выполнения этой задачи все обработчики событий должны совместно использовать одну и ту же сигнатуру. Листинг 4.21. Общий обработчик событий Protected Sub CommonEventHandler(ByVal sender As Object, ByVal e As System.EventArgs) Handles Buttonl.Click, Button2.Click, Forml.Click If sender Is forml Then msgbox("Form Clicked") Else msgbox(CType(sender, Button).text) End If End Sub Ключевое слово Handles позволяет создавать обработчики событий во время разработки. Но иногда приходится это делать и во время выполнения. Для этого в VB.NET добавлены новые операторы AddHandler и RemoveHandler. Как следует из названия, оператор AddHandler используется для назначения обработчика событий тому или иному событию, а оператор RemoveHandler — для удаления созданного назначения. Ниже приведен синтаксис и примеры использования операторов AddHandler и RemoveHandler. Синтаксис операторов AddHandler и RemoveHandler: AddHandler O b j e c t . E v e n t , Delegate RemoveHandler O b j e c t . E v e n t , Delegate
События
65
Примеры использования операторов AddHandler и RemoveHandler: AddHandler B u t t o n l . C l i c k , AddressOf me.EventHandler RemoveHandler B u t t o n l . C l i c k , AddressOf me.EventHandler В листинге4.20 ключевые слова AddressOf и me.EventHandler используются для создания делегата. Впервые слово AddressOf было введено в Visual Basic 5.0 для обработки вызовов API, использующих необходимые обратные вызовы. В VB.NET ключевое слово AddressOf можно применять для создания делегата любой функции, процедуры или метода.
Создание событий Возможность создания событий существовала в Visual Basic начиная с версии 5.0. Процесс создания событий всегда был достаточно прост, что сохранилось и в VB.NET. Синтаксис этой операции практически не изменился. Для того чтобы объявить событие в классе, достаточно воспользоваться ключевым словом Event для описания имени события и параметров, которые передаются событием обработчику событий: P u b l i c Event EventName(event parameters) Единственное, на что следует обратить внимание: параметры события в .NET Framework могут быть определены точно так же, как и само событие. Памятуя об этом, можно определить событие следующим образом: P u b l i c Event EventName(ByVal sender as Object, ByVal e as System.EventArgs) Определение параметров событий происходит примерно по тем же правилам, что и определение параметров процедур или функций. События могут быть объявлены как ByVal или ByRe f, но не могут содержать какие-либо именованные или необязательные параметры. Кроме того, события не могут иметь возвращаемых значений.
Генерация событий Генерация событий происходит настолько же просто (или даже еще проще), как и создание событий. В VB.NET используется тот же синтаксис, что и в Visual Basic 5.0 или 6.0. Для генерации событий внутри класса предназначен оператор R a i s e E v e n t , которому в качестве аргумента передается имя события: RaiseEvent EventName(параметры события)
Использование EventArgs Класс System. EventArgs определяет базовый класс аргументов события (т.е. параметров). Пример использования этого класса приведен в листинге 4.22. Листинг4.22. Параметры обработчика событий (наследование System.EventArgs) Public Class MyMouseEventArgs Inherits System.EventArgs Public Readonly Property XPositionO As Integer Get Return cursor.Position.X End Get End Property Public Readonly Property YPositionO As Integer Get 66
Глава 4. Методы, свойства, события
Return Cursor.Position.Y End Get End Property End Class В листинге 4.23 приведен код события, использующего класс EventArgs.
Листинг 4.23. Использование созданного класса EventArgs Public Event MouseOver(ByVal Sender as Object, ByVal e as System.EventArgs) Public Sub TestRaiseEvent() RaiseEvent Ctype(MouseOver(Me,New MyMouseEventArgs).System.EventArgs) End Sub Private WithEvents MyEventObject as MyEventObjectTester Private Sub MyEventHandler(ByVal Sender as Object, ByVal e as System.EventArgs) Handles MyEventObject.MouseDown, Forml.Click Dim oMyMouseEventArgs as MyMouseEventArgs If Not Sender is Forml Then oMyMouseEventArgs = Ctype(e, MyMouseEventArgs) Console.WriteLine(e.XPosition.ToString() ) Console.WriteLine(e.YPosition.ToString()) Else Console.WriteLine("Form Raised Click Event") End If End Sub
Атрибуты Одним из наиболее мощных нововведений .NET Framework является новая модель программирования на основе атрибутов. Атрибуты {attributes) представляют собой метки, размещенные внутри программного кода, которые могут быть применены к сборкам, классам, полям, методам или свойствам. Атрибуты добавляют декларативные функциональные возможности как в .NET Framework, так и в создаваемый код. Синтаксис, используемый для добавления атрибутов, достаточно прост, но следует заметить, что существует несколько важных правил. Начнем с базового синтаксиса, представленного следующим выражением: В листинге 4.24 приведен пример атрибута WebMethod, объявленного на уровне метода. ЛИСТИНГ 4.24. Атрибут WebMethod
<WebMethod()> Public Function GetEmployees() as DataSet Dim oDataSet as New DataSet 'Код для создания набора данных Return oDataSet End Function / Атрибут WebMe thod не содержит каких-либо обязательных параметров, поэтому используется в таком виде, как показано в листинге 4.24. Для объявления атрибутов на уровне сборки в качестве меток атрибута используется первая строка кода, найденного в исходном файле, причем модификатор должен быть размещен в метке: Атрибуты
67
Для того чтобы объявить атрибуты на уровнях класса, метода, поля или свойства, метки атрибута должны быть вложены соответственно в объявление класса, метода, поля или свойства перед его именем. Пример использования атрибута WebMethod описанных уровней приведен в листинге 4.25. Листинг 4.25. Объявление функции как WebMethod <WebMethod()> Public Function GetClientName(ByVal ClientID as Integer) as String End Function Атрибут WebMethod объявляет метод как службу. В этом случае среда исполнения CLR (Common Language Runtime) изменяет информацию в виде XML. Интеграция с Visual Studio.NET частично выполнена с помощью атрибутов. В листинге 4.26 приведен пример использования атрибутов для определения формата отображения свойств серверного элемента управления ASP.NET на странице свойств в Visual Studio.NET. ЛИСТИНГ 4.26. Свойства в окне страницы свойств Property EndDateO As Date Get Return CType(State("EndDate"), Date) End Get Set c_dteEndDate = Value State("EndDate") = Value If c _ d t e S t a r t D a t e < c_dteEndDate Then CreateTimeTable() End I f End Set End Property
Свойство EndDate (см. листинг 4.26) содержит ряд различных атрибутов. Атрибут B i n d a b l e указывает на то, что свойство может быть связано; C a t e g o r y определяет, какая категория свойств должна быть включена в окно просмотра свойств (в данном случае— " D a t e s " ) ; DefaultValue присваивает свойству значение по умолчанию. И наконец, атрибуты играют очень важную роль в межкомпонентном взаимодействии в .NET Framework. В листинге 4.27 показано использование атрибутов в процессе упаковки запроса (другими словами, маршалинга) с использованием стандартных механизмов СОМ. Листинг 4.27. Использование атрибутов для выполнения стандартного маршалинга Declare Auto Sub CopyFile Lib "Kernel32" (ByVal <MarshalAs(UnmanagedType.LPTStr)> existingfile As String, ByVal <MarshalAs(UnmanagedType.LPTStr)> newfile As String, ByVal failifexists As Boolean)
Резюме Создание среды .NET Framework повлекло за собой появление различных новых возможностей, относящихся к событиям и моделям объектно-ориентированного программирования в Visual Basic. Наиболее существенное нововведение среды .NET Framework — работа с атрибутами свойств, методов и событий.
68
Глава 4. Методы, свойства, события
Создание и удаление объектов В структуру новой версии языка Visual Basic добавлены конструкторы. Конструкторы (constructors) обеспечивают возможность инициализации объекта непосредственно после его создания, а также позволяют передать объекту необходимые параметры во время создания. Язык VB.NET разрешает использование конструкторов как в классах, так и во встроенных типах, например целочисленных и строчных.
Конструкторы Конструкторы встроенных типов называются также инициализаторами (initializers). В листинге 5.1 приведен пример метода, используемого в предыдущих версиях Visual Basic для инициализации целого числа. В этом случае объявление переменной и ее инициализация происходят в два этапа. ЛИСТИНГ 5.1. Инициализация целого числа в преды-
дущих версиях Visual Basic Dim I as integer 1 = 5 В .NET Framework язык Visual Basic был расширен, что позволяет инициализировать переменную при ее объявлении. Пример, приведенный в листинге 5.2, показывает, как происходит описанный процесс в VB.NET. ЛИСТИНГ 5.2. Инициализация целого числа в VB.NET Dim I as integer = 5
Событие C l a s s _ I n i t i a l i z e Visual Basic поддерживает начиная с версии 4.0. Это событие выполняется в том случае, когда во время создания объекта не существует какого-либо способа передачи ему необходимых параметров. Например, если понадобится параметрически управляемая инициализация, придется ввести метод инициализации в класс, как показано в листинге 5.3.
Листинг 5.3. Инициализация объекта в Visual Basic 4.0-6.0 Set oEmployee = New CEmployee oEmployee.Init iEmployeelD 'В проекте есть файл Cemployee.ds со следующим кодом Public Sub Init(ByVal employeelD as I n t e g e r ) Dim oDBConnection as ADODB.Connection Dim oDBCommand as ADODB.Command Dim oDBRecordSet as ADODB.RecordSet 1 Выполните код доступа к базе данных для возврата 'Employee и заполнения свойств End Sub
В языке VB.NET событие C l a s s _ I n i t i a l i z e заменено конструкторами класса. Конструктор определяется с помощью процедуры New. Для того чтобы в одном классе существовало несколько конструкторов, следует воспользоваться перегрузкой функций. Перегрузка — это возможность выбора компилятором различных реализаций одной и той же функции, в зависимости от типов ее параметров при вызове. В листинге 5.4 приведен пример кода класса VB.NET, использующего перегрузку и несколько различных конструкторов. Листинг 5.4. Перегруженные конструкторы VB.NET Public Class Employee Private c_sFirstNarrie as s t r i n g Private c_sLastName as String Public Overloads Sub New() MyBase.NewO 'Вызов конструктора базового класса End Sub Public Overloads Sub New(ByVal FirstName as String, ByVal LastName as String) MyBase.New()' Вызов конструктора базового класса Me.FirstName = FirstName Me.LastName = LastName End Sub Public Property FirstName() as String Get FirstName = c_sFirstName End Get Set(ByVal Value as String) c_sFirstName = value End~Set End Property Public Property LastName() as String Get LastName = c_sLastName End Get Set (ByVal Value as String) c_sLastName = value End Set End Property End Class
Первая строка программного кода в конструкторе класса является обращением к специальной переменной MyBase.New, относящейся к базовому классу, из которого наследуется данный класс. (Не забывайте, по крайней мере, что все классы наследуются из System.Object.) В том случае, если вы не создаете конструктор, он будет автоматически создан компилятором. После этого компилятор вызовет переменную MyBase. New. 70
Глава 5. Создание и удаление объектов
Деструкторы Событие C l a s s _ T e r m i n a t e точно так же, как и событие C l a s s _ I n i t i a l i z e , поддерживается языком Visual Basic начиная уже с версии 4.0. Выполнение события C l a s s _ T e r m i n a t e происходит после удаления последней ссылки на экземпляр какоголибо объекта. Подобные функциональные возможности реализованы на основе СОМмодели управления ресурсами, т.е. на подсчете существующих ссылок. В среде .NET Framework, как отмечается в главе 10, "ADO.NET", подсчет ссылок не используется. Поэтому событие C l a s s T e r m i n a t e для данного случая является не более чем частью языка программирования. При наличии явной очистки ресурсов, которая необходима для завершения класса, следует ввести в программный код метод F i n a l i z e , представленный в листинге 5.5. Листинг 5.5. Метод Finalize Protected Sub Finalize() 'Закрытие соединения с базой данных oDBConnection.Close End Sub Класс, содержащий метод F i n a l i z e , отмечается компилятором, как класс, требующий завершения. Когда процесс очистки памяти от ненужных данных, или "сборщик мусора", встречает класс с методом F i n a l i z e , он перемещает экземпляр класса в очередь объектов, нуждающихся в завершении. После завершения процесса "сборки мусора", т.е. утилизации памяти, освобождаемой в процессе работы программы, происходит вызов метода F i n a l i z e объектов, находящихся в очереди на завершение. Следует подчеркнуть, что обращение к методу F i n a l i z e происходит через некоторое время после удаления последней ссылки, относящейся к данному экземпляру класса. Постарайтесь избежать использования этого метода при последующей разработке программных компонентов. Их использование значительно замедляет процесс "сборки мусора". Созданный объект должен быть сразу же очищен от ненужных данных. Это особенно важно в том случае, когда объект содержит дефицитные ресурсы, к которым относятся, например, подключения к базе данных, дескрипторы файлов и т.п. Для этих целей следует воспользоваться не методом F i n a l i z e , а шаблоном проектирования Dispose.
(ЧтЧто такое шаблон проектирования? Шаблон проектирования представляет собой описание периодически возникающей проблемы, содержащее одну из моделей ее решения. Таким образом, шаблон проектирования описывает не только существующую проблему, но и способ ее решения. Шаблон достаточно прост. Все, что нужно сделать, — реализовать интерфейс System. I D i s p o s a b l e и его метод D i s p o s e . В том случае, если разработчик не сможет обратиться к методу D i s p o s e , требуемая очистка может быть выполнена с помощью метода F i n a l i z e . Существует еще одна потенциальная проблема шаблона проектирования Dispose, возникающая при повторном вызове метода F i n a l i z e из метода Dispose. Для того чтобы выйти из этой ситуации, при условии, что данный класс содержит метод F i n a l i z e , необходимо вызвать метод S u p r e s s F i n a l i z e из метода Dispose. Синтаксис метода Supp r e s s F i n a l i z e приведен в листинге 5.6. Деструкторы
71
Листинг 5.6. Подавление повторного завершения System.GC.SuppressFinalize() Шаблон проектирования Dispose используется непосредственно в среде .NET Framework. Например, при создании формы Windows конструктор формы добавляет обращение к методу Dispose. В листинге 5.7 приведена часть кода, сгенерированного конструктором форм Windows. Листинг 5.7. Метод Dispose в форме Windows Public Overrides Sub Dispose О MyBase.Dispose() If Not (components Is Nothing) Then components.Dispose() End If End Sub
Модификаторы доступности Модификаторы доступности управляют видимостью классов, методов, свойств и событий. В Visual Basic 6.0 доступность определяется свойствами класса, а также модификаторами доступности методов, свойств и событий.
Модификаторы классов Значения свойства I n s t a n c i n g , определяющего способ создания экземпляров класса в Visual Basic 6.0, представлены в табл. 5.1. Таблица 5.1. Значения свойства instancing в Visual Basic 6.0 Значения свойства Instancing Private
Описание Доступ к этому классу разрешен только из проекта, где он создан
PublicNotCreatable
Объекты этого класса могут использоваться другими приложениями только в том случае, если объекты созданы в проекте, где находится данный класс
SingleUse
Объекты этого класса могут быть созданы другими приложениями, но каждый объект этого класса, создаваемый клиентом, запускает новый экземпляр компонента
GlobalSingleUse
Объекты этого класса доступны для других приложений и могут быть созданы вне проекта, в котором находится данный класс. Это значение свойства не поддерживается VB.NET
MultiUse
Объекты этого класса могут быть созданы другими приложениями. Независимо от количества создаваемых объектов, создается только один экземпляр компонента
GlobalMultiUse
Объекты этого класса могут быть созданы другими приложениями. Это значение свойства не поддерживается VB.NET
По сравнению с предыдущей версией уровни доступности классов в VB.NET несколько изменились. В табл. 5.2 приведены уровни доступности классов, существующие в VB.NET.
72
Глава 5. Создание и удаление объектов
Таблица 5.2. Уровни доступности классов в VB.NET Уровни доступности
Описание
Public
Объекты класса доступны без ограничений
Private
Объекты класса доступны только в пределах текущего пространства имен.
Protected
Объекты класса доступны производным типам
Friend
Объекты класса доступны другим типам в пределах одного пространства имен Свойства доступа данного класса представляют собой сочетание свойств Protected и Friend
Это относится также и к объектам вложенных классов
Protected Friend
В табл. 5.3 представлены свойства доступности классов Visual Basic 6.0, а также способы назначения подобных свойств в VB.NET (если это возможно). Таблица 5.3. Отношение свойств классов Visual Basic 6.0 и VB.NEJ Visual Basic 6.0
Visual Basic.NET
Private
Класс отмечается как P r i v a t e
. PublicNotCreatabie
Класс отмечается как P r i v a t e , конструктор — как F r i e n d
SingleUse
He поддерживается
GlobalSingleUse
He поддерживается
MultiUse
Класс отмечается как P u b l i c , конструктор — как P u b l i c
GlobalMultiUse
He поддерживается
Модификаторы методов и свойств Использование модификаторов не ограничивается только классами. В VB.NET существует также набор модификаторов, которые позволяют изменять доступность методов и свойств. В табл. 5.4 представлены модификаторы, существующие в Visual Basic 6.0. Таблица 5.4. Уровни доступности методов и свойств в Visual Basic 6.0 Уровни доступности
Описание
Private
Доступны только для класса, в котором они были созданы
Public
Доступны за пределами класса, в котором они были созданы
Friend
.
Доступны в пределах проекта, в котором они были созданы, но являются закрытыми по отношению к внешнему коду
Уровни доступности методов и свойств VB.NET по сравнению с Visual Basic 6.0 значительно изменились. Модификаторы языка VB.NET представлены в табл. 5.5. Таблица 5.5. Уровни доступности методов и свойств в VB.NET Уровни доступности Public
Описание Доступны без ограничений
Private
Доступны только в том классе, в котором они были созданы
Protected
Доступны только в классе, в котором они были созданы, или в каких-либо других классах, производных от класса, в котором они были созданы
Модификаторы доступности
73
Окончание табл. 5.5 Уровни доступности
Описание
Friend
Доступны в коде в пределах одного и того же пространства имен
Protected Friend
Свойства доступности представляют собой сочетание свойств P r o t e c t e d И Friend
Резюме В настоящее время Visual Basic представляет собой полностью объектно-ориентированный язык программирования. Это объясняется требованиями среды .NET Framework, которая является объектно-ориентированной. Кроме этого, Visual Basic — наиболее самодокументированный язык, доступный в настоящее время для .NET Framework.
74
Глава 5. Создание и удаление объектов
ГЛАВА 6 Создание проектов VB.NET VB.NET поддерживает все типы проектов, доступные в среде .NET Framework, к которым относятся службы Windows (Windows Services) и консольные приложения (console applications). В то же время из VB.NET удалены некоторые типы проектов, доступные в более ранних версиях. В этой главе приведен краткий обзор каждого из типов проекта, доступных в VB.NET. На рис. 6.1 показаны основные компоненты .NET Framework, с которыми вы познакомитесь в этой главе.
Неподдерживаемые типы проектов Следует заметить, что все типы проектов из предыдущих версий Visual Basic в среде .NET Framework не поддерживаются. В Visual Basic 6.0 имеется ряд Webприложений, которые в .NET Framework более недоступны. В их число входят WebClasses, DHTML Applications и ActiveX Documents. Существующие средства миграции позволяют преобразовать проекты WebClasses в Web Forms. Эти средства не поддерживают преобразование проектов DHTML Applications и ActiveX Documents. Кроме того, удалена поддержка проектов Data Report.
Библиотеки классов Visual Basic версий 5.0 и 6.0 позволяет разработчикам создавать проекты ActiveX DLL и ActiveX EXE. В языке VB.NET им соответствует проект Class Library. Нельзя сказать, что проекты Class Library полностью подобны проектам ActiveX EXE или ActiveX DLL. Но именно они позволяют создавать компоненты многократного использования. Большая часть существующих свойств ActiveX EXE реализована в самой среде .NET Framework. Например, .NET Framework поддерживает "настоящий" многопоточный режим, используемый приложениями Windows Form и DCOM.
В состав конструктора проектов Class Library входит средство Server Explorer и инструментальная панель, что обеспечивает все необходимые инструменты для быстрой разработки приложений (Rapid Application Development — RAD). Рассмотрим процесс создания библиотеки классов подробнее. Этот процесс иллюстрируется на рис. 6.2—6.8. Сгенерированный код, приведен в листинге 6.1. На рис. 6.2 показан первый этап процесса. В начальном окне Visual Studio.NET (Start Page) щелкните на кнопке New Project.
Рис. 6.1. Основные компоненты среды .NETFramework
c. 6.2. Начальное окно Visual Studio.NET
76
Глава 6. Создание проектов VB.NET
Появится диалоговое окно New Project, показанное на рис. 6.3. Выберите из списка этого окна шаблон Class Library и присвойте ему имя ClassLibraryProject.
l i i s j
Templates:
Proe j ct Types:
t S Visual Basic Protects i - Q Visual C# Protects О Visual C++ Protects ; C j Setup and Deployment Protects ffl C l Other Protects D Visual Studio Solutions
ей* Wnidows Appcilao tin
all Wndows ControlLb i rary : €| Web Web ServtieWeb Control Appcilao tin Lbrar, и
[A protect for creating ca lsses to use In other appc il ato i ns Name: | Ca l ssUbraryProe l ct Locato i n: j F:\Vs l ual Studo i Proe jctsV/BOotNetForOevdopersSamp TJ Browse.. Г AddtoSokjtlon
С doseSolution
Protect will be created at F:\..AVBDotNetPorDevelopers3ampleProtects\ClassLlbraryPT0)ect. «More.
Cancel
Help
Рис. 6.3. Создание проекта на основе шаблона Class Library
Щелкните правой кнопкой мыши на файле c l a s s l . v b в окне Solution Explorer и удалите его из проекта, выбрав соответствующую команду в контекстном меню (рис. 6.4). ClassUbruryProjoct Microsoft VisualBasic.NET[design] Clami.vn E»e Edit ye j w E'olect B"M Cebug look Wn jdow Hep l H % i- **! iW m i a S 1 Л "л % Л .
clasU .vrb |roelct) |S *;tacrtlaP «alne(CU iislb aryP Public Class С lass 1
Output
вви
3 В Щ ClaiillbraryProject i d References Assembrylnfo.vb
Task l i t
"Ready
Pue. 6.4. Удаление из создаваемого проекта файла classl. vb
После удаления файла c l a s s l . v b воспользуйтесь командой ProjectOAdd Component. Появится диалоговое окно, показанное на рис. 6.5. Присвойте новому компоненту класса имя Chapter6. Созданный новый компонент будет открыт в окне конструктора, как показано на рис. 6.6. Библиотеки классов
77
Add New Hem: ClassUbraryProjecl Categore i s: it- 'cJ LocalProe j ct Items
Tempa l tes: Wn idows Form Ca lss
Moduel-
Component User Control DataFom i Ca lss Wziard DataSet XML File XML Schema [A class for creating component; иягч the vsual designer Name:
| Chapter*
Open
Caned
|
Hdp
Puc. 6.5. Добавление к проекту нового компонента класса ClassLibraryProjecl - Microsoft Visual Besfc.NET [design] - Chaptcr6.vb (., FJe E* SS«» Eroject guM Cebug look glndow si: 11= * 5i | щ * ш i s о ? о fs i«° ж Start Page Chapter6.vb [Design] | **x 0 iI
To add components to your class, drag them from the Server Expo l rer ar Toob i o^ and use thi roperhe5 wn idow to set their properties. To create methods and everts for your class, click he> e *.o
3
;wi!ch to code yi?w.
Output
Tack List
Ready
Puc. 6.6. Конструктор компонентов Visual Studio.NET После добавления компонента к создаваемому проекту необходимо изменить корневое пространство имен проекта. Для этого откройте диалоговое окно Project Properties, показанное на рис. 6.7, щелкнув правой кнопкой мыши в окне Solution Explorer на имени проекта (в данном случае— C l a s s L i b r a r y P r o j e c t ) и выбрав из контекстного меню команду Properties. Введите какое-либо имя корневого пространства имен. И последнее: добавьте новый метод к созданному классу. Для этого дважды щелкните в окне конструктора и введите соответствующий код в появившемся окне (рис. 6.8).
78
Глава 6. Создание проектов VB.NET
ClasslibrarjProjecl Property Pages >~4lCommon Properte is • General Butt Reference Path Sharn ig D g ivn«er^.au Defautls ue ns 1[s
Gl ConFlgurattm Properties
Startup object;
Output type:
(Class Library
dI
Root namespace: vBDotNetForDevelopers I—
tnf ormation Project folder: Project file: Output name:
-
-
—-
F:\Visual Studio Pro)ects\VBDotNetForDevelopers5ampleProjects\aas ClassLtoraryProject.vbproj OassUbraryProJect.dll
Caned
Apply
Help
Puc. 6.7. Окно свойств проекта
ClasslibraryProjec! - Microsoft Visual Besic.NET (design] - Chapter6,vb* File Edit Ve i w Protect guild uebug loots ffihdow ft* m щ, t . A* [m * i •- s i л % % ?%.
Start Page Chapteirj.vb [Desg i n]* Chapter6.vb» | 1^*Chapter6 (VBDotNetF or Developers) j j | *AddToPer For mant «Counter Public Class Chapter6 " ' " ~'~ Inherits Systern.CurnponentModel.Component ii k Public Sub AddToPerformanceC<x«i ter(r!yVdl amount As Integer) End Sub End class
Out.pijt Task L.S I' Ready Puc. 6.8. Добавление метода компонента
Программный код, сгенерированный в результате описанных действий, приведен в листинге 6.1. ЛИСТИНГ 6.1. Код, генерированный конструктором компонента 'Visual Studio.NET добавляет наследование 'из System.ComponentModel.Component Public Class Chapter6 I n h e r i t s System.ComponentModel.Component
Библиотеки классов
79
'Дескриптор #Region не является частью языка Visual Basic 'Он генерируется редактором и используется для 'сворачивания фрагмента кода #Region " Component Designer generated code " 'Следующий код используется дизайнером Public Overloads Sub New(Container As System. ComponentModel.IContainer) 'Вызов конструктора базового класса MyClass.New () 'Необходима поддержка Windows.Forms Container.Add(me) End Sub 'Следующие код используется приложением Public Overloads Sub New() MyBase.New() 'Этот вызов необходим конструктору InitializeComponent() 'Добавьте любые вызовы после InitializeComponent() End Sub 'Необходимо конструктору компонентов Private components As System.ComponentModel.Container 'ЗАМЕЧАНИЕ. Следующая процедура необходима конструктору компонентов 'Не используйте для ее изменения редактор кода <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent () •Chapter6 End Sub #End Region 'Добавьте после всех методов метку #End Region, 'которая используется для сворачивания фрагмента кода Public Sub AddToPerformanceCounter(ByVal amount As Integer) End Sub End Class Обратите внимание, как используются свойства наследования средой .NET Framework для обеспечения различных служб: конструктора (через наследование) и отладки (через свойства). Кроме этого, приведенный код наглядно демонстрирует, как с помощью наследования происходит интегрирование исходного кода и конструкторов в Visual Studio.NET. Создаваемый класс наследуется из System.ComponentModel .Component, т.е. предоставляются методы, которые позволяют среде .NET Framework управлять разрабатываемым компонентом.
Приложения Web Form Одна из целей разработки среды .NET Framework— возможность создания Webприложений на основе языка HTML. В 1996 году корпорацией Microsoft была представлена технология Active Server Pages (ASP), большая часть Web-приложений создавалась с 80
Глава 6. Создание проектов VB.NET
использованием стандарта Common Gateway Interface (CGI) в форме исполняемых программ, генерирующих динамический HTML. В ASP совмещены свойства статического языка HTML и сценариев. К сожалению, в подобной архитектуре на одной странице "смешивается" код представления и программный код, что вызывает определенные проблемы как в процессе разработки, так и при сопровождении. Для решения описанной проблемы в Visual Basic 6.0 были добавлены проекты WebClasses, которые, как оказалось, имели недостатки, связанные в основном с низкой масштабируемостью. В среду .NET Framework включена новая версия ASP — ASP.NET; в ней создан новый тип проекта Web Forms. В таких проектах можно использовать технологию "перетащить и опустить" для создания Windows-приложений на основе форм. Создаваемые Web-формы обычно связаны с элементами управления на стороне сервера. Сервер выполняет какие-либо свойства, методы и события гораздо чаще, чем клиент. Основное различие между Web Forms и Windows Forms состоит в том, что элементы управления Windows Forms связаны с пользовательским интерфейсом, a Web Forms генерируют код HTML, интерпретируемый броузером.
Создание приложения Web Form При создании нового приложения Web Form в Visual Studio.NET среда разработки возьмет на себя выполнение ряда необходимых действий. В первую очередь на сервере Internet Information Server (IIS) будет создано приложение ASP.NET, а также все требующиеся записи в метабазе IIS и необходимые папки. После этого создается заданная по умолчанию Web-форма, которая затем открывается в окне конструктора Web Form. Откройте начальную страницу Visual Studio.NET и щелкните на кнопке New Project. Появится диалоговое окно New Project. В списке шаблонов выберите Web Application и присвойте имя, показанное на рис. 6.9. Щелкните на кнопке ОК. Visual Studio.NET вместе с IIS создает записи в метабазе IIS, а также все файлы, необходимые для приложения Web Form. На рис. 6.10 показано окно состояния процесса создания.
Puc. 6.9. Создание приложения Web Form
Приложения Web Form
Puc. 6.10. Проект создается
81
Готовый проект будет открыт в ранее созданной начальной Web-форме (рис. 6.11). Выберите на панели инструментов элемент управления Label и перетащите его на ранее созданную Web-форму (рис. 6.12). VBDolNetForDevelopersWeb -
0! г tj V
Edtt Vfew Eroject &j«d
M i c r o s o f t Visual Dasic.NET [ d e s i g n ]
Jebug
Farmat
Tabje
Insert
F[am«!
WebF,. Iooh
W,
d O H
StwtPage WebForml^spK |
H
4
'
:
;
fr
;
*
X
!
Q
\
:
^
\
er : :
•
i
f
Toolbox
•.;; И '..["."..'.'.". ХЫ patjis у»..- are wtfiir-.q an is \r< ( i r k i sycur fiicd*) sna objects t.-vlO fc« • • • ; ; ' ! ] ! ; • ; ; * , • ) ; ' ! J u i r ^ g u d tjiing 'ibs^'ucs C» and у) .io;rdsK.!t!fi-. ! ! ! ! ! ! ! ; ; ! ! ;
• : : : : •
.
:
:
! ' " , * * ! .'. 1 To enable ffotM iay^jt.
!
;
;
i
••
•'.':':'•.
I f
•'.::.
: у
...
: J
..
[ Q Design "] В HTML Output
|
»
I
E l
1
Task List
Ready
I
'•>,
A
Л«с. 6.1/. Созданный проект в окне HTML-конструктора
VBDoN l etForDevetopereWeb Microsoft Visual Oasc i .NET [design] WebF... ,f-lfn|fX[ ТаЦс Insert Fcames Ed« Proe j ct Jfn l dow Toolk««
-»
Data
x| i _
4 • X _
__—«_—___
W e b Forms It
Pointer
A
Label
f
Sw TextBox •bj Button JS1 LiriWutton ^
ImageButton
Д
Hyperurk
i k ) ; s ; / U y ) w a d ' ^ f e ' ' - ' * " ' ' • ; " : ::
:
:
; ;.:: :
otloiti. as Ln a H.jfdf;n:w:f-^Jri-j riov4>'№n!), ••'..' .
» t y of И» О О С И в П Ю FbwUnrout
. . ••
•
1 3 DropDownUst :J3 Data's id ЁЭ lotBox . J 3 Datalist H
Repeater
Components HTM C|*oardRlnjL__ General (Xitpiat
j .:::.:::::';::;:::;;::;::::;:;: .:.::.::.:;.:;:;..:::::.:.::.: :..:;.:
:.: : . >zl
1
Task list
Ready
Pttc. 6.12. Добавление элемента управления Label на Web-форму
82
Глава 6. Создание проектов VB.NET
Web-форма с элементом управления Label показана на рис. 6.13. После создания формы и добавления элемента управления Label дважды щелкните мышью на странице. Появится окно для ввода кода события Page_Load данной формы (рис. 6.14). VBDotNetForDevetopersWeb - Microsoft Visual Basic.NET [design] - WebF., Edit
View
Project
guild
Gebug
L-Г e - ' Start Page WebForm.laspH* |
Format
Tab(s
'-I
Insert
Frames
lools
Window
1 3 B ! :=
Це1р
'• Private Sub InitializeComponent() End Sub Protected Sub Page_Init(ByVal Sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 'ЗАМЕЧАНИЕ. Этот метод необходим конструктору 'Не используйте для его изменения редактор кода InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Сюда добавьте пользовательский код инициализации страницы Labell.Text = "Hello World!!!!" End Sub End Class После выполнения всех действий, представленных на рис. 6.9-6.14, вы получите работающее Web-приложение Hello World. Обратите внимание, что при создании этой Webстраницы не пришлось блуждать в дебрях языка HTML и заниматься обработкой строк. Web-страница, создаваемая при выполнении приложения, показана на рис. 6.15. -Э hll|i://locdlhiisl/VBDi>tNetForDuviMniJKrsWeti/WfobFnrini. На
Ed*
Vim
Favortes
Took
Help
Addr <meta name="CODE_LANGUAGE" content="Visual Basic 7.0"> <meta name=vs_defaultClientScript content="JavaScript"> <meta name=vs_targetSchema content="Internet Explorer 5.0">
|
Приложения Web Form 7.0"> 85
|