Главная страница Visual 2000 · Общий список статей
Публикации в журнале BYTE/Россия · Публикации на тему MS .NET

А ты готов к Visual Basic.NET?
Советы тем, кто собирается работать с новой версией VB
Часть 3

Андрей Колесов

© Андрей Колесов, 2001
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале BYTE/Россия N 3/2001.
Внимание! Статья отражает знание автором предмета на момент ее публикации! Использовалась версия VB.NET beta 2!


Начало: Часть 1 Часть 2

Мы завершаем обсуждение темы...

Мы завершаем обсуждение темы, что нужно иметь в виду для обеспечения переноса программ, написанных на VB 6.0, в среду VB.NET. Напомним — такой переход будет непростым, так довольно многие конструкции VB 6.0 не будут работать в новой версии системы. Более того, некоторые из них будут выполняться, но иначе, чем в текущей версии.

Дискуссия на эту тему завершается по той простой причине, что время споров истекло — финальная версия VB.NET появится до конца года и если вы решили работать с ней (а куда деваться?), то нужно уже начинать писать новые приложения в этой среде. Кроме того, в июне вышла версия Visual Studio.NET бета 2 (см. "Что нового в Visual Studio.NET Beta 2"), и стало понятно, что ждать каких-то радикальных уступок со стороны Microsoft в ответ на критику по поводу несовместимости VB 6.0 и VB.NET и соответствующих проблем с переносом приложений не приходится.

Так или иначе, но в западной прессе дискуссионные публикации по поводу VB.NET сменились статьями на традиционную тему, как работать с новой версией системы. Что и мы собираемся сделать в последующих номерах "Байта".

Вместе с тем хотелось бы обратить внимание на статью Рассела Джонса "VB.NET против классического VB" (VB.NET Faces Off Against Classic VB"), в которой он приводит 10 примеров, демонстрирующих преимущества новой версии (статью можно найти по адресу www.vb-zone.com/free/articles/).

Однако я бы хотел высказать свое несогласие с пафосом этой статьи — представляется совершенно очевидным, что каждая новая версия инструмента должна быть лучше предыдущей. Безусловно, в VB.NET реализованы многие очень интересные и полезные функции. Но суть-то проблемы заключается в том, что большинство новшеств можно было бы реализовать, обеспечивая совместимость версий. И примеры, приводимые американским автором, на самом деле как раз это демонстрируют.

В частности, в качестве достоинства VB.NET он говорит о том, что теперь порядок обхода элементов управления на форме (он задается свойством TabIndex) теперь можно будет задавать с помощью встроенной команды Tab Order. Но ведь такая команда уже давно появилась еще в составе Office 97/VBA. Что мешало включить ее и в VB?

Конечно, очень здорово, что наконец-то будет реализована возможность динамического подключения к форме элементов управления к форме в процессе выполнения приложения. Но ведь и в момент создания VB 1.0 в среде Windows 3.0 не было никаких технический проблем для реализации такой полезной функции.

Безусловно, появление VB.NET является очень важным моментом в истории этого популярного средства программирования. (Более того, весь пакет Visual Studio.NET знаменует качественно новый этап развития средств разработки на основе качественно более высокого уровня интеграции.) В этой связи полезно вспомнить, что в мае нынешнего года Visual Basic отметил свой десятилетний юбилей — его первая версия появилась в 1991 году и впервые была продемонстрирована в СССР на выставке Softool'91. По этому поводу имеет смысл вспомнить об основных этапах жизни "Васика".

В начало статьи

Изменения синтаксиса в VB.NET бета 2

Прежде, чем предложить завершающую часть "Советов", нужно рассказать о некоторых модификациях синтаксиса VB.NET по сравнению с первой бетой.

Отметим, что с самого начала дискуссий о VB.NET никто не отрицал вероятность того, что Microsoft может пойти на некоторые уступки своим критикам. Однако, зная стиль работы корпорации, можно было уверенно утверждать, что уступки будут минимальными и, возможно, временными. По крайней мере, вся десятилетняя история VB хорошо показывает, что за внешней внимательностью к запросам разработчикам находится довольно жесткая линия стратегии Microsoft, которая ведет сообщество программистов в нужном корпорации направлении.

Выход версии бета 2 показывает, что сколь-нибудь значительного числа "откатов" со стороны Microsoft не следует ждать. Вот список некоторых из новшеств, ряд которых нужно учесть при изучении ранее опубликованных нами "Советов".

  1. Описание массивов, вроде Dim a(10), будет работать так же, как и предыдущие 40 лет существования языка Basic. То есть в данном примере, 10 - - это верхняя граница индекса массива, а не число его элементов, как это грозились сделать в VB.NET (об этом говорилось в Совете 17).

  2. Операции And, Or, Not и XOR, как и ранее, будут использоваться как для логических, так и поразрядных, операций. В первой бета-версии VB.NET эти операции выполнялись только с логическими переменными, а для целочисленных вводились дополнительные функции вида BitXXX (BitAnd и т.д.), которые теперь исключены (Совет 20).

  3. В Совете 21 мы говорили о повышении "интеллектуальности" логических операций. В частности, в выражении

    
    a = A1 And A2
    

    операнд A2 не будет анализироваться, если A1 = False. (Операнд A2 может представлять собой функцию, которую желательно в любом случае вычислить.) Теперь же подобный режим оптимизации нужно задавать в явном виде, используя специальные операторы AndAlso и OrElse, например следующим образом:

    
    If x > 0 AndAlso x < 10 Then ...
    

    (второе условие не будет проверяться, если x <= 0)

    
    If x > 0 OrElse x <-10 Then
    

    (второе условие не будет проверяться, если x > 0)

    Мне кажется, что такое разделение логических функций является искусственным и не очень нужным, так как коллизия с выражениями легко решается последовательным их вычислением:

    
    A1 = Function1() A2 = Function2() a = A1 And A2
    

  4. Значение логической переменной True, по-прежнему будет иметь целочисленное значение -1, а не 1, как планировалось (Совет 19). Мне кажется, что это не очень принципиально, так как общая рекомендация заключается в том, чтобы вообще не использовать неявное преобразование типов данных (в данном случае целочисленных и булевых). В этой связи отметим также, что все же было бы полезно разделить логические операции на булевыми и беззнаковыми целыми числами.

  5. Для сравнения двух объектных переменных (для проверки ссылок на один и то же объект) по-прежнему будет использоваться ключевое слово Is (VB 6), а не простой знак равенства = (VB.NET бета 1).

  6. Теперь все классы наследуют метод ToString объекта System (родитель всех объектов в .NET), который преобразует числовое значение в текстовый вид. Однако тут следует иметь в виду, что разделитель целой и дробной части числа (точка или запятая) будет зависеть от национальных установок Windows.

    Такой метод позволить порой существенно упростить код программы. Например, вот как выглядит функция получения уникального глобального кода в VB 6:

    
    Private Declare Function CoCreateGuid Lib _
      "ole32.dll" (buffer As Byte) As Long
    Private Declare Function StringFromGUID2 Lib _
      "ole32.dll" (buffer As Byte, ByVal lpsz As Long, _
       ByVal cbMax As Long) As Long
    
    Private Function getGUID () As String
      Dim buffer(0 To 15) As Byte
      Dim s As String
      Dim ret As Long
      s = String$(128, 0)
      ' получает численный код
      ret = CoCreateGuid (buffer(0))
      ' преобразуем его в текст,
      ' используя недокументированную функцию StrPtr
      ret = StringFromGUID2 (buffer(0), StrPtr(s), 128)
      getGUID = Left$(s, ret - 1) ' отсекаем "хвост"
    End Function
    
    В VB.NET все это будет выглядеть гораздо компактнее:
    
    Private Function getGUID () As String
      getGUID = "{" & System.Guid.NewGUID.ToString & "}"
    End Function
    

  7. Для совместимости с функциями VB 6.0 используется пространство имен Microsoft.VisualBasic.Compatibility.VB6. Чтобы избежать написания таких длинных названий при работе со старыми функциями теперь можно применять специальный оператор Import.

  8. Ранее для обозначения коллекций объектов VB использовалось множественное число имени объекта ("Parameters", "Properties" и т.д.) Теперь коллекции будут называть длиннее, но более понятно: "ParameterCollection", "PropertyCollertion".

  9. В бета 1 библиотека ADO.NET имела два важных пространства имен: System.Data.ADO для общих провайдеров данных и System.Data.Sql для провайдера SQL Server. Теперь эти имена называются соответственно System.Data.OleDb и System.Data.SqlClient.

Это не полный перечень всех изменений в синтаксисе VB.NET. И можно предположить, что он не окончательный — в финальной версии нас могут ждать новые сюрпризы.

Еще несколько советов по переходу в VB.NET

В начало статьи

Совет 30. Внимание при объявлении переменных

VB 6 поддерживает такую забавную конструкцию с объявлением переменной внутри исполняемого кода:


Do
  Dim nTotal As Long
  nTotal = nTotal + 1
Loop Until nTotal > 100 MsgBox "Результат = " & nTotal

В результате его выполнения будет выдано сообщение "Результат = 101". А в VB.NET вы получите системное сообщение об ошибке — "переменная nTotal не объявлена". Причина этого заключается в том, что в VB.NET подобная переменная работает только внутри операторных скобок, в которых она определена (в данном случае Do Loop). Так что, конструкция, выглядевшая в VB 6 довольно несуразной, получает весьма четкую смысловую окраску.

Кстати, для увеличения переменной на некий шаг теперь можно применять такой синтаксис:


nTotal += 1

В начало статьи

Совет 32. Откажитесь от использования Null

Честно говоря, я никогда не понимал глубокого смысла парадигмы Null, которая использовалась для обозначения особого, "нулевого" значения переменной типа Variant. Вполне естественно, что с исчезновением Variant из VB.NET удален и Null.

В начало статьи

Совет 33. Готовьтесь к однозначности строковых функции

Как известно, в VB было два варианта функций обработки строки — с суффиксом $ и без него. Например, Left$ возвращала переменную типа строка, а Left — типа Variant. Теперь останется только Left, но возвращаться будет только строка.

В начало статьи

Совет 34. Используйте VB.NEt Update Tool

По мнению Microsoft это инструмент, включенный в состав VB.NET, обеспечит автоматический перенос 95 процентов приложений, написанных с помощью VB 6.0, в среду VB.NET. Он сможет выполнить следующие преобразования синтаксиса языка:

- преобразование переменных типа Variant в тип Object (см. Совет 13);

- преобразование типов данных Integer и Long соответственно в Short и Integer (см. Совет 12);

- установка свойств объектов в явном виде (т.е. код TextBox = 1 будет заменен на TextBox.Text = 1);

- замена массивов с ненулевой нижней границей на массивы типа Wrapper Class.

В начало статьи

Что нового в Visual Studio.NET Beta 2

Помимо некоторых изменений в составе отдельных средств (о новшествах языка VB говорится в статье "А ты готов к VB.NET"?) Microsoft включила еще несколько дополнительных возможностей для разработчиков.

Во-первых, на стартовой странице VB.NET появилась новая вкладка Web Hosting, с помощью которой можно получить список поставщиков услуг ASP .NET Web, которые предоставляют бесплатное Web-пространство для распространения законченных компонентов и приложений. Во-вторых, на вкладке "Что нового?" стартовой страницы имеется ссылка на огромный список утилит и компонентов независимых разработчиков в дополнение к VS.NET.

Следует также обратить внимание на то, что пока VB, VC++ и C# существуют только в объединенном варианте. Microsoft объясняет это тем, что оба средства имеют очень большое число общих компонентов. Корпорация ничего не говорит о том, как будет выглядеть окончательный вариант поставки, но вариант того, что отдельных программ VB и VC++ больше не будет, представляется весьма вероятным.

Не очень определенно выглядит также ситуация с поддержкой работы VS.NET в среде Windows 9x и Windows ME. В сопроводительной документации на версию бета 2 подчеркивается, что она тестировалась в среде Windows NT 4.0, Windows 2000 и Windows XP. Что же касается Windows 98 и ME, то здесь лишь обещается, что в них будет поддерживаться "выполнение кода" (code execution). При этом непонятно, о чем идет речь — работе среды VS.NET или поддержке только создаваемых в ней приложений.

В мае Microsoft выпустила бета версию нового набора для разработчиков мобильных Web-приложений на базе технологии ASP.NET — Microsoft .NET Mobile Web SDK Beta 1. Конструктор Mobile Web Forms Designer для создания мобильных Web-форм также включен в состав VS.NET Beta 2.

Изменения ожидают также разработчиков приложений масштаба предприятий: издание VS.NET Enterprise Edition будет поставляться в двух вариантах — Developer и Architect, для разработчиков и архитекторов систем соответственно. Пока соотношение этих двух версий не очень ясно (получается, что для полного цикла разработки нужно будет покупать два недешевых продукта) и о версии Architect говорится лишь то, что она будет нацелена на решение трех задач — моделирование приложений, моделирование баз данных и управление средой разработки.

В варианте Enterprise будет также использован механизм Open Tools Platform, которые позволяет предоставляет весь набор инструментов, интегрировать в среду программирования VS.NET решения сторонних разработчиков. Для привлечения третьих фирм — поставщиков инструментальных средств — Microsoft объявила программу Visual Studio.NET Integration Program (VSIP). Одним из первых ее участников стала компания Rational Software, уже объявившая о поддержке данной платформы и интеграции своего средства Rational Suite с Microsoft VS.NET.

Сроки выхода окончательной версии Visual Studio.NET не обнародованы, но обещается, что это произойдет во второй половине 2001 года.

В начало статьи