Продолжается подписка на наши издания! Вы не забыли подписаться?

VB.Net**

Программистов, использующих VB в своей работе, можно, с одной стороны, поздравить с тем, что их любимое средство стало более универсальным, функциональным и много еще с чем, но можно и огорчить. Огорчить тем, что VB как таковой прекратил свое существование. VS.Net – это не VB! Нет, сохранились 90 % языковых конструкций языка, да и среда не стала хуже, но старого доброго VB больше нет. Главное, что изменилось – платформа, на которой был создан VS. VB 3-6 планомерно (с некоторыми рывками и застоями, но планомерно) развивался в сторону поддержки COM. И вдруг COM был снят с повестки дня. Вместо него пришел монстр, которому и посвящен весь этот обзор. Нет, COM не умер, вот только приоритеты поменялись. Кстати, а кто-нибудь, знает, как назывался .Net Framework до того, как он стал .Net и CLR? А он назывался COM+! Да, да я ничего не путаю. Во времена, когда Windows 2000 еще была в ранних бета версиях, в тогда еще MSJ вышла одна статья. В ней взахлеб рассказывалось про новый язык программирования под названием COM+, который радикально упростит программирование COM+-объектов под W2k. А причем тут VB? А при том, что тогдашний COM+-язык и есть сегодняшний CLR. И VB.Net ничем не отличается от той радужной картинки, вот только к COM-у все это отношение имеет очень отдаленное.

Ну да ладно. Чем же придется пожертвовать программисту, пожелавшему бросить старый добрый VB 6 и пересесть на новый и навороченный VB.Net (он же VB 7)? И что этот программист получит взамен?

Первое, чем придется пожертвовать – краткостью и внешней простотой синтаксиса. Связано это с тем, что VB перестал поддерживать свойства по умолчанию. То есть он их поддерживает, но только для свойств-коллекций (параметризованных свойств). Например, если в List.Items(...) свойство Items помечено как свойство по умолчанию, его можно опустить, как и в прошлых реализациях VB: List.Items(...). Но если свойство не является списком, например, TextBox1.Text = ..., то написать TextBox1 = "Некоторый текст" уже не удастся. Так что новый Basic стал длиннее, а краткость – сами знаете, чья сестра. «Зачем это сделано?» – спросите вы. А за тем, чтобы избежать неоднозначностей. CLR пропагандирует типо-безопасность. Так что и VB теперь типа безопасный язык ;).

Не будет теперь и dispatch-а, но позднее связывание осталось. Причем во многих случаях работу через dispatch можно заменить грамотным использованием приведения объекта к базовому классу. Доступна и runtime-загрузка, для этого применяются общие для всех CLR-совместимых языков библиотечные функции. Об этом уже упоминалось ранее. Так что все стало даже лучше, но кое-что в своем коде придется поменять.

Самое главное - поменялись все базовые библиотеки. Они теперь, как и всё остальное, общие, и о них уже говорилось в разделе «Библиотеки». И вообще, большинство изменений связано с переходом на CLR. Так что если вы пропустили предыдущие разделы, то настоятельно рекомендую вернуться к ним. Далее рассматриваются главные изменения и новые возможности, появившиеся в VB.Net.

Оператор «Set»

Удален оператор «Set». С одной стороны, это несомненное упрощение языка, но, с другой стороны, вместе с ним удален и явный способ запросить указатель на дополнительный интерфейс, реализуемый объектом. Новая архитектура ориентируется на наследование. Как и в прошлой версии, можно реализовывать любое количество интерфейсов, это делается с помощью ключевого слова Implements. Однако теперь нельзя реализовать только часть методов, нужно описывать все. Для запроса необходимого интерфейса можно воспользоваться новой функцией CType или создать переменную с типом необходимого интерфейса и присвоить объект этой переменной. Ниже приведен пример консольного приложения, демонстрирующего работу с интерфейсами:

Interface IItf1
    Sub Method1()
End Interface

Interface IItf2
    Sub Method1()
End Interface

Public Class Class1
    Implements IItf1, IItf2

    Public Sub Method1() Implements IItf1.Method1
        Console.WriteLine("IItf1.Method1")
    End Sub
    Public Sub Method2() Implements IItf2.Method1
        Console.WriteLine("IItf2.Method1")
    End Sub
End Class

Module Module1

    Sub Main()
        Dim obj As New Class1()

        Console.Write("Вызываем: obj.Method1() => ")
        obj.Method1()

        Console.Write("Вызываем: obj.Method2() => ")
        obj.Method2()

        Console.Write("Вызываем: CType(obj, IItf1).Method1() => ")
        CType(obj, IItf1).Method1()

        Console.Write("Вызываем: ... Itf2 = obj ...  => ")
        Dim Itf2 As IItf2
        Itf2 = obj
        obj.Method1()

        Console.WriteLine("Нажмите Enter для выхода из программы...")
        Console.Read()
    End Sub

End Module

Консольный вывод:

Вызываем: obj.Method1() => IItf1.Method1
Вызываем: obj.Method2() => IItf2.Method1
Вызываем: CType(obj, IItf1).Method1() => IItf1.Method1
Вызываем: ... Itf2 = obj ...  => IItf1.Method1
Нажмите Enter для выхода из программы...

Как видно из примера, работать с интерфейсами и классами, их реализующими, на VB довольно просто. Для запроса интерфейса у COM-объекта используются те же принципы. При этом запрашиваемый интерфейс должен быть упомянут в описании COM-объекта, например:

coclass AtlTestCls
{
  [default] interface IItf1;
  interface IItf2;
};

Если интерфейс не упомянут, его нельзя запросить от этого объекта напрямую. Однако если предварительно получить указатель на некоторый интерфейс, то с помощью функции CType можно получить указатель на любой другой. Непросто заполучить и указатель на интерфейс, помеченный в COM-объекте как «default» ([default] interface IItf1;). Для этого тоже придется воспользоваться функцией CType. Так что код, прекрасно работающий в VB 6, может спокойно не заработать в новом Basic'е. Причем контроль выполняется во время компиляции. Более того, «умная» среда пытается выполнить эту проверку в момент написания кода, подсвечивая (как в Word) неправильное, с ее точки зрения, присвоение...

**Полный текст статьи вы можете найти в печатной версии журнала

Copyright © 1994-2016 ООО "К-Пресс"