Рекомендации по обновлению. Использование раннего связывания и явного преобразования
Обновлен: Ноябрь 2007
Объекты с поздней привязкой поддерживаются как в Visual Basic 6.0, так и в Visual Basic 2008 и являются результатом объявления переменной в качестве переменной с типом данных Object с последующим ее присвоением экземпляру класса при выполнении. Однако в процессе обновления объекты с поздним связыванием могут вызвать проблемы при разрешении свойств, заданных по умолчанию, или в случаях, когда исходная модель объектов была изменена и необходимо преобразование свойств, методов и событий. Например, существует форма Form1 с меткой Label1; в следующем примере коде Visual Basic 6.0 в качестве заголовка метки будет задано значение "SomeText":
Dim o As Object
Set o = Me.Label1
o.Caption = "SomeText"
В Visual Basic 2008 свойство Caption элемента управления Label замещается свойством Text. При обновлении кода все экземпляры свойства Caption изменяются на Text, однако поскольку объекты с поздним связыванием не имеют типа, Visual Basic не может определить тип объекта или необходимость передачи каких-либо свойств. В этом случае код нужно изменить после его обновления.
Если код написан с помощью объектов с ранним связыванием, он обновляется автоматически:
Dim o As Label
Set o = Me.Label1
o.Text = "SomeText"
По возможности следует объявлять переменные соответствующего типа объектов, а не типа данных Object.
При использовании переменных Object и Variant в коде Visual Basic 6.0 рекомендуется производить явные преобразования при их присваивании, выполнении действий с этими переменными, а также при их передаче функции. Например, в следующем коде неясен смысл операции "+":
Dim Var1 As Variant
Dim Var2 As Variant
Dim Var3 As Variant
Var1 = "3"
Var2 = 4
'BAD: Should Var1 and Var2 be added as strings or integers?
Var3 = Var1 + Var2
При выполнении этого примера в Visual Basic 2008 может возникнуть ошибка во время выполнения. Если записать последнюю строку с использованием явного преобразования, код будет работать:
'GOOD: explicit conversion
Var3 = CInt(Var1) + CInt(Var2)
В Visual Basic 2008 поддерживается перегрузка функций на основе типа параметра. Например, функция Environ имеет две формы:
Environ( Expression As Integer) As String
Environ( Expression As String ) As String
В Visual Basic 2008 вызываемая функция определяется на основе типа параметра. Если функции Environ() передается целочисленный параметр, вызывается целочисленная версия; при передаче строки вызывается строковая версия. Код, в котором перегружаемой функции передается тип данных Variant или Object, может вызвать ошибку во время выполнения или ошибку компилятора. При использовании явного преобразования после обновления до Visual Basic 2008 код будет выполняться так, как ожидается:
Dim a As String
Dim v As Variant
v = "Path"
'GOOD: explicit conversion
a = Environ(CStr(v))
Использование явного преобразования объектов с поздним связыванием является признаком хорошего тона в программировании. Смысл кода в этом случае становится яснее, а обновление приложения до Visual Basic 2008 проще.