Cамоучитель по VB.NET

   Детали для мебели на www.msk.detalburg.ru. | Плита мдф купить и еще. |       

.NET и изменение парадигмы


Какое отношение все сказанное имеет к .NET? Самое прямое. Видите ли, .NET изменит подход к проектированию приложений так же сильно, как появление классов в VB


некогда повлияло на проектирование приложений VB5 и 6. И переход на .NET вызовет определенные неудобства — как и переход от «бесклассовых» версий VB к поддержке классов! [ В поставку VB .NET входит утилита преобразования программ, но'не стоит возлагать на нее чрезмерные надежды. Ни одна серьезная программа не преобразуется автоматически — возможно, ее будет проще написать с нуля. ]

Рассмотрим некоторые факторы, которые следует учитывать при переходе с VB6 на VB .NET.

 

Common Language Runtime

Исполнительная среда (runtime) всегда присутствовала в Visual Basic, поэтому следующее утверждение поначалу выглядит несколько странно. Итак, одним из самых серьезных новшеств VB .NET является наличие исполнительной среды CLR (Common Language Runtime), общей для всех языков .NET. Хотя на первый взгляд CLR напоминает обычную библиотеку времени выполнения наподобие библиотеки С MSVCRTXX.DLL, библиотека VB MSVBVMXX.DLL имеет значительно большие размеры и обладает гораздо большими возможностями. По этой причине написание программ, в полной мере использующих CLR, больше походит на программирование для API новой операционной системы [ Возможности библиотеки классов .NET Framework настолько широки, что вам практически не придется использовать функции API. ].

Поскольку все языки .NET используют одну и ту же среду CLR, необходимость в исполнительных средах для отдельных языков отпадает. Более того, код, предназначенный для выполнения в CLR, может быть написан на любом языке и с одинаковым успехом использоваться во всех языках, соответствующих спецификации CLR [ В этом проявляется главное отличие .NET от Java: на платформе .NET можно использовать любой язык при условии, что он соответствует спецификации CLR. Программа, написанная на Java, работает на любой платформе (по крайней мере теоретически — на практике возникают проблемы), но при условии, что она написана именно на Java. Вероятно, именно языковая интеграция станет одной из составляющих успеха .NET. ]. В частности, код VB может использоваться в программах, написанных на С#, и наоборот, причем это не потребует дополнительных усилий со стороны программиста.

Следующее принципиальное новшество — общий формат исполняемого кода .NET, так называемый Microsoft Intermediate Language (промежуточный язык Microsoft), MSIL или просто IL Он представляет собой частично откомпилированный код, преобразуемый в машинный код средой .NET во время выполнения. Перед нами принципиальное усовершенствование схемы, существовавшей во всех версиях VB до версии 5. Раньше приложения VB компилировались в Р-код (псевдокод, машинный язык абстрактной машины), своего рода промежуточное представление окончательного исполняемого кода. Механизм времени выполнения интерпретировал Р-код при запуске программы пользователем. Пользователи постоянно жаловались на плохое быстродействие [ Вообще-то, в большинстве случаев причины следовало искать в другом месте. Скорость работы с мышью ограничена, так что в большинстве приложений с пользовательским интерфейсом переход на компилированный код особого выигрыша не давал. ]и упрашивали Microsoft включить в VB поддержку компиляции в машинный код. Начиная с версии 5 появилась возможность выбора между компактным Р-кодом и машинным (native) кодом, который занимал больше места, но теоретически быстрее работал. В языках .NET преимущества Р-кода объединились с преимуществами компилируемых языков. Сначала программа, написанная на любом языке, компилируется в IL (отдаленный аналог Р-кода), а затем полученный IL-код преобразуется в машинный код. Подобная двухшаговая схема относительно легко обеспечивает межъязыковую совместимость, а итоговое использование машинного кода обеспечивает хорошее быстродействие.

 

VB как объектно-ориентированный язык

Объектно-ориентированные средства VB5 и VB6 были, мягко говоря, ограниченными. В частности, эти версии VB не позволяли автоматически инициализировать данные класса при создании экземпляра. В результате объект создавался в неопределенном состоянии, что повышало вероятность ошибок и заставляло программиста принимать дополнительные меры предосторожности при работе с объектами. Для решения этой проблемы в VB .NET появились параметризованные конструкторы (см. главу 4).

Другим недостатком было отсутствие полноценного наследования (эта тема рассматривается в главе 5 [ Наследование — штука полезная, но оно не является панацеей для написания объектно-ориентированных программ, как считают некоторые. Бесспорно, это важное, но не самое важное усовершенствование в VB .NET. ]). Наследованием называется особая форма многократного использования кода, при которой программист определяет новые объекты на базе существующих объектов. Наследование очень хорошо подходит для таких задач, как создание нового текстового поля с расширенными возможностями на основании стандартного текстового поля. В VB версий 5 и 6 наследование не поддерживалось, поэтому для построения улучшенного текстового поля приходилось прибегать к услугам неудобной и ненадежной программы-мастера (wizard).

Рассмотрим другой пример, в котором было бы уместно наследование, — создание классов для работы со специализированными коллекциями. Чтобы создать коллекцию, специализировавшуюся на хранении строковых данных, в VB5 и 6 в класс включалось закрытое поле:

Private mCollection As Collection

В обработчиках событий Initialize и Terminate происходило выделение и освобождение памяти, используемой закрытой коллекцией. Затем программировались методы специализированной коллекции, предназначенные для внешнего использования. Большинство таких методов сводилось к простому вызову соответствующего метода закрытой коллекции, например:

Sub Add(Item As String)

mCollection.Add Item

End Sub

Но самое противное начиналось в том случае, если содержимое коллекции требовалось перебирать в цикле For Each. Для этого в модуль класса приходилось включать фрагменты вида:

Public Function NewEnum As lUnknown

Set NewEnum = mCollection.[_NewEnum]

End Function

Но и это не все — этой функции следовало присвоить идентификатор —4!

Принцип «абракадабра — достаем из шляпы кролика!» хорош для фокусника, но не для программиста. При использовании наследования вся эта белиберда не нужна. В VB .NET достаточно написать:

Class MyCollection

Inherits Collection

...и вы получаете автоматическую поддержку For Each (см. главу 5).



Содержание раздела