Объектная ориентация
VB.NET – это язык программирования, предназначенный для создания приложений, работающих с платформой Microsoft .NET Framework. Платформа .NET, в свою очередь, устраняет многие ограничения "классической" COM, объектной модели компонентов Microsoft, которая обеспечивает единый подход к взаимодействию приложений и компонентов. Эти ограничения включали несовместимость типов при вызове COM-компонентов, трудности с версиями (DLL hell) при разработке новых версий COM-компонентов и необходимость для разработчиков писать определенный объем кода (в основном на C++) для обработки COM. Из-за взаимодействия с COM VB.NET предлагает ряд новых функций и преимуществ.
С выпуском четвертой версии Visual Basic в него добавили поддержку классов и модулей классов, в связи с чем в процессе он стал объектно-ориентированным языком программирования. Тем не менее продолжаются споры о том, является ли Visual Basic "истинным" объектно-ориентированным языком или он поддерживает только ограниченные возможности объектной ориентации.
Дискуссия сосредоточена вокруг поддержки Visual Basic наследования, концепции объектно-ориентированного программирования, которая позволяет классу получать свои свойства и функциональность от другого класса. Сторонники точки зрения, что Visual Basic является объектно-ориентированным языком, указывают на поддержку Visual Basic для интерфейсного программирования и использование виртуальных базовых классов. И все же сравнительно немного программистов на VB пользуются преимуществами программирования на основе интерфейса. А само программирование на основе интерфейса не позволяет производному классу наследовать функциональность базового класса; только виртуальные базовые классы могут быть унаследованы с помощью ключевого слова Implements.
Хотя объектно-ориентированный характер предыдущих версий VB может вызывать споры, нет сомнений в том, что VB.NET является объектно-ориентированным языком программирования. На самом деле, даже если VB.NET используется для написания того, что кажется процедурным кодом, он, так сказать, объектно-ориентированный "под капотом".
Общая система типов
Традиционно, одна из проблем вызова подпрограмм, написанных на других языках из Visual Basic, или вызова подпрограмм Visual Basic из других языков состоит в том, что такие межъязыковые вызовы предполагают систему общего типа. Это имеет место при вызове функций Win32 API из Visual Basic, но это также относится к попыткам вызова методов в компоненте COM VB из других языков или для вызова методов в сторонних компонентах COM из VB.
Например, до добавления оператора AddressOf, который позволяет нам передавать указатель на функцию или подпрограмму, не было никакого способа предоставить функцию обратного вызова, которая требуется большинством функций перечисления Win32 API. В качестве другого примера, ожидается, что члены структур, переданных в функции Win32 API, будут выровнены по своим естественным границам, что было очень трудно для программистов VB.
Проблемы совместимости типов чаще всего возникали, когда скриптовые приложения использовались для вызова и передачи аргументов COM-компонентам. Отличным примером является попытка передать массив из сценария, написанного на JScript, в компонент COM, поскольку COM рассматривает массивы JScript как строку значений, разделенных запятыми, а не как COM-совместимый массив (называемый SafeArray).
Платформа .NET устраняет эти трудности, предоставляя общую систему типов. В конечном итоге все типы данных являются либо классами, либо структурами, определенными или унаследованными от библиотеки классов .NET Framework. Эта система общего типа означает, что компоненты .NET будут действительно независимыми от языка, и что компонент .NET, написанный на одном языке, будет легко взаимодействовать с компонентами .NET, написанными на любом другом языке .NET. Проблема несовместимых типов просто исчезает.
На первый взгляд, VB сохранил свою старую систему типов. Например, VB по-прежнему поддерживает тип данных Long, хотя теперь он представляет собой 64-разрядный тип данных вместо 32-разрядного типа данных VB 4 – VB 6. Случайная проверка кода, показанного в примере ниже, свидетельствует о том, что VB сохранил свою систему типов. Однако если мы используем ILDASM для проверки IL, сгенерированного из этого кода Visual Basic, мы увидим, что типы данных VB являются просто оболочками для типов данных, предоставляемых .NET Framework.
В следующем примере программа также поддерживает этот вывод. Программа создает целое число типа Long, стандартного типа данных Visual Basic. Затем она вызывает метод ToString – метод класса Int64 для преобразования этого числа в его строковое представление. Другими словами, переменная примере действительно является типом данных Int64, маскирующимся под традиционный тип данных VB Long.
Доступ к системным службам: библиотека классов фреймворка
С тех пор, как VB добавил поддержку для вызовов подпрограмм в API Windows и Win32, многие программисты Visual Basic стали рассматривать API-программирование как разновидность "черной магии". Не только запутанный и, казалось бы, безграничный массив функций, которые можно вызывать, но и передача параметров подпрограммам и получение их возвращаемых значений часто казались очень загадочным процессом. Более того, с растущим акцентом на объектно-ориентированное программирование, Win32 API с его функциональным подходом к программированию казался все более и более архаичным.
Хотя оператор Declare остается в VB, и программисты по-прежнему могут вызывать Win32 API и подпрограммы в других внешних библиотеках Windows, многие из общих системных служб, предоставляемых Win32 API, а также некоторыми компонентами COM, теперь предоставляются .NET Framework Class Library. Framework Class Library – это коллекция типов (классы, структуры, интерфейсы, делегаты и перечисления), организованных в пространства имен.
Общая среда исполнения
Хотя VB традиционно защищает разработчика от многих сложностей Windows как операционной системы или COM как метода взаимодействия, тем не менее, некоторые небольшие знания о том, как работает система, все же необходимы, иначе разработчик наверняка рано или поздно столкнется с проблемой. Например, рассмотрим следующий фрагмент кода для VB 6:
Из-за идиосинкразии VB объекты, объявленные и созданные с использованием ключевого слова New в той же строке кода, фактически не создаются до первой ссылки на этот объект. В результате наша попытка определить, является ли объект oObj значением Nothing, воссоздает объект, и наш cleanup code никогда не выполняется.
В .NET многие подобные проблемы устраняются благодаря общеязыковой среде выполнения (CLR) платформы .NET. CLR, как понятно из его названия, предоставляет различные сервисы приложениям и процессам, работающим на платформе .NET, независимо от языка, на котором они были изначально написаны. Эти сервисы включают управление памятью и сборку мусора. Они также включают в себя унифицированную систему обработки исключений, которая позволяет использовать один и тот же набор средств отладки для всего кода, независимо от конкретного языка .NET, на котором он был написан.
Переменные и типы данных
Многие программисты принимают понятие переменной как должное. В этой части статьи мы подробно рассмотрим переменные и их свойства, обсудив такие вещи, как область действия и время жизни переменной.
Переменные
Переменная может быть определена как сущность, которая имеет следующие шесть свойств:
- Имя. Имя переменной используется для идентификации переменной в коде. В VB.NET имя переменной может начинаться с алфавитного символа Unicode или знака подчеркивания, и за ним могут следовать дополнительные символы подчеркивания или различные символы Unicode, например алфавитные, числовые, форматирующие или комбинированные символы.
- Адрес. Каждая переменная имеет связанный адрес памяти, который является местом в памяти, в котором хранится значение переменной. Обратите внимание, что во многих случаях адрес переменной будет меняться в течение срока ее службы, поэтому было бы опасно делать какие-либо предположения относительно этого адреса.
- Тип. Тип переменной, также называемый типом данных, определяет возможные значения, которые может принимать переменная.
- Значение. Значением переменной является содержимое ячейки памяти по адресу переменной. Это также иногда называют r-значением переменной, поскольку это то, что действительно отображается с правой стороны оператора присваивания.
- Область видимости. Область видимости переменной определяет, где в программе эта переменная видна коду.
- Время жизни. Время жизни переменной определяет, когда и как долго существует конкретная переменная. Она может быть или не быть видимой (то есть находиться в области видимости) в течение всего этого периода.
Подробнее следует остановиться на области видимости и времени жизни переменных.
Область видимости
Если переменная объявлена внутри блока кода (набор операторов, который заканчивается оператором End ..., Loop или Next), тогда переменная имеет область видимости уровня блока; то есть она видна только внутри этого блока.
Например, рассмотрим следующий код:
В этом коде переменная rec не распознается за пределами блока, в котором она определена, поэтому последний оператор выдает ошибку.
Время жизни переменной
Переменные также имеют время жизни. Разница между временем жизни и областью видимости довольно проста. Время жизни относится к тому, когда или в какое время во время выполнения программы переменная является действительной; область видимости – это то, где в программе переменная распознается кодом.
Чтобы проиллюстрировать разницу, рассмотрим следующую процедуру:
Обратите внимание, что LocalVar является локальной переменной. Когда выполняется строка "Call ProcedureB" выполнение переключается на процедуру B. В то время как строки Процедуры B выполняются, переменная LocalVar находится вне области видимости, поскольку она является локальной для Процедуры A. Но она все еще в силе. Другими словами, переменная все еще существует и имеет значение. Она просто не доступно для кода в процедуре B. Фактически, у MethodB также может быть локальная переменная с именем LocalVar, которая не будет иметь ничего общего с переменной с тем же именем в процедуре A.