很久以来我们都知道,VB因为缺乏完善的面向对象支持、缺乏高效的错误处理机制和性能表现不佳,因而一直受到某些人的嘲笑。VB.NET语法将彻底改变这种情况。
然而,VB.NET在这些方面的改进也要付出代价,许多旧的代码需要手工进行转换才能在VB.NET下运行。
下面几个表格总结了VB.NET语言在语法上的改动之处。注意这些表格并没有完全列出所有改动之处,但列出了最重要的一些改动。
表A对比了VB6中一些熟悉的语法形式及其在VB.NET中类似功能最接近的语法形式。
表A:VB.NET语法对比旧语法 新语法 说明窗体装载事件,类初始化事件 Sub New procedure Sub New称为构造方法(Constructor),它可以有参数。
Property Let Property Set Let关键词不再有效。
Currency Decimal 在VB6中,Decimal是Variant的一种子类型,但在。NET中它是一种固有的数据类型。。NET不再支持Currency数据类型。
Variant Object VB.NET的Object数据类型兼有VB6 Object类型和Variant类型的能力。
Debug.Print Debug.Write Debug.WriteLine 这个变化只是名称上的简单变化:从Print变为Write和WriteLine. Wend End While VB.NET推荐使用While循环而不是Do循环。
为了让VB.NET语言的数据类型和其他。VB.NET语言的数据类型相匹配,Microsoft修改了整数类数据类型的表示方法,并加入了一个新的数据类型。这些改动对于进行外部调用的方法尤其重要(比如API调用)。
例如,如果被调用函数需要一个32位的整数参数,则在VB6中它应该声明为Long,在VB.NET中应该声明为Integer.
表B:和整数有关的数据类型长度 VB6以及更早版本中的名称 VB.NET中的名称16 bit Integer Short 32 bit Long Integer 64 bit (无) Long
在VB.NET中,Microsoft减少了许多原先用于VB6的关键词,代之以“框架类”。之所以要进行这种替换,是因为框架类中的功能对所有的.NET语言都有效。下表列出了部分受影响的关键词。
表C:被替换的关键词
VB关键词 VB.NET名称空间中的位置 方法/属性
- Circle System.Drawing.Graphics DrawEllipse
- Line System.Drawing.Graphics DrawLine
- Atn System.Math Atan
- Sgn System.Math Sign
- Sqr System.Math Sqrt
- Rnd Microsoft.VisualBasic.Compatibility.VB6 Rnd
- Round Microsoft.VisualBasic.Compatibility.VB6 Round
- Lset System.String PadRight
- Rset System.String PadLeft
- DoEvents System.Winforms.Application DoEvents
- VarType System.Object GetType(返回类Type的对象,其中包含了可提取出信息的属性)
在VB.NET中,变量、数组的声明和初始化方法都有所变化,下表概要地列出了VB.NET在这方面的变化。
表D:新的声明方法
变化 语法举例
单个声明语句中不能声明多种类型。 'VB.NET不允许出现下面这种声明!
Dim nCount As Integer, bAnswer As Boolean
声明变量时可赋予初始值 Dim nCount As Integer = 20
Dim nDoubleCount as Integer = nCount * 2
允许为数组元素指定初始值 Dim nIndex(3) As Integer = (3, 5, 7)
不能用Redim进行声明,只能用Redim重新定义数组大小。 '下面这行代码在VB.NET中不合法!
- Redim sName() As String
大量新关键词实现了VB.NET中的新功能。下面是一些最重要的关键词及其用途、用法简例。
表E:VB.NET的新关键词
关键词 用途 简单例子
Inherits 指向基类,用于实现继承。 Inherits System.WinForms.Form
MyBase 在子类的代码中,MyBase引用基类。 StringProperty = MyBase.StringProperty
Shared Shared表示类的所有实例共享类里面的变量。
- Public Shared BaseLocation As String
- Try
- Catch
- Finally
Throw 这是新的错误处理关键词。Try开始一个启用错误控制的代码块,Catch标识一个对特定错误进行处理的代码块,Finally开始一个不管错误是否出现都必须执行的代码块,Throw抛出一个错误(类似于VB6的Err.Raise)。
- Try
- rsRecordset.Update
- Catch
- LogError ("更新失败!")
- Finally
- rsRecordset.MoveNext
- End Try
- ReadOnly 在属性声明中,ReadOnly指示一个只读的属性(只有Get过程的属性)。 Public ReadOnly Property
- StringProperty() As String
- WriteOnly 在属性声明中,WriteOnly指示一个只能写入的属性(只有Set过程的属性)。 Public WriteOnly Property
- StringProperty() As String
- Char 这是VB.NET中的单字符数据类型。 Dim chrInitial As Char
- Imports 在当前代码模块中引入指定类。 Imports System.WinForms
- Namespace 为模块指定名称空间(Namespace)。 Namespace MyApplicationName
- Overloads 重载。Overloads表示同一个函数名字有多个版本的实现,编译器通过函数的参数列表区分它们。 '同一个模块之内包含如下多个声明...
- Overloads Sub Display(sIn as String)
- Overloads Sub Display(nIn as Long)
- Overrides 覆盖。Overrides表示成员函数覆盖当前类所继承的基类中的指定方法。 Inherits MyBaseClass
- Overrides Function Name(nID as Long) _
- As String
- Overridable Overridable表示任意从当前类继承的类都可以覆盖指定成员函数。 Overridable Function Name _
- (nID as Long) As String
- MustOverride MustOverride表示任意从当前类继承的类都必须覆盖指定成员函数。 MustOverride Function Name _
- (nID as Long) As String
- Protected Protected表示成员函数只能从当前类的派生类访问。 Protected Sub Clear()
在以前的VB中,直至VB 4为止, Let、Set和Get属性过程是分离的。VB.NET把同一属性的属性过程放到了一起:
- Private msMyStringProperty As String
- ' 声明区
- Public Property MyStringProperty As String
- Get
- MyStringProperty = msMyStringProperty
- End Get
- Set
- msMyStringProperty = MyStringProperty
- End Set
- End Property
VB.NET不再有Let属性过程,因为所有赋值语句的语法(无论是对象还是非对象)都已经一样。
语言方面的改动远远超过了对体系结构的改动。对于大多数人来说这些改动都有意义,但仍有人对某些改动存有异议。例如,在以前的版本中,许多任务可以用多种不同的方法完成,统一的编码标准要么不存在,要么很难执行。为了“清理”VB语言,Microsoft对VB作了一些重大的改动,许多以前可以有多种实现方法的任务现在只有一种方法。
除了前面几个表格列出的内容之外,下面是一些特别需要注意的地方。
首先,向过程参数传递数据的默认方式由原来的传递引用(ByRef)变成了传递值(ByVal),这是一个很重要的改动。通过引用传递参数比通过值传递参数面临着更多的危险,这种危险在于被调用过程可能无意地改变参数的值。VB.NET仍旧允许以引用方式传递参数,但默认参数传递方式的改变意味着程序必须作相应的调整。
第二,VB.NET中不再有Set语句,把对象引用赋给变量现在只需一个等号就可以了,对象可以象任何其他值一样对待。虽然省略Set简化了代码,但也有一个附带的影响:默认属性不再有效。
例如,下面这种属性值引用方法不再合法:
Text1 = "这是对象的默认属性值。"
相反,属性值必须按照如下方式显式引用:
Text1.Text = "这是对象的默认属性值。"
从表面上看来,VB.NET作这种要求似乎没有必要。但事实上,它对于摆脱默认属性来说却是必要的。例如,假设有一个名字为objFoo的对象变量,由于没有了Set语句,假若属性值仍旧可以象原来一样引用,下面这个语句到底是什么意思就很难确定了:
- objFoo = Text1
这个语句是设置了一个对Text1的引用,还是把Text1的Text属性值赋给了objFoo?我们无法作出判断,编译器也同样不能判断。因此,抛弃Set语句也就意味着必须放弃默认属性值。
NET中最不让人喜欢的改动:Microsoft改变了一些早就在使用的数据类型的含义。在。NET中,Integer变成了32位,而Long则是64位。可以想象,这种改变将导致程序员频繁地用错变量类型。例如,调用某个API函数时应该使用16位的Integer还是使用32位的Integer?但愿Microsoft能够重新考虑这个决定,采用一些新的变量类型名字,如Int32和Long64.
VB.NET引入了Option Strict关键词。Option Strict关键词用于替代Option Explicit.原来的VB允许把一个数字值赋给字符串变量,或者进行其它类似的不正常赋值操作,Option Strict结束了这种情况。声明Option Strict告诉Visual Basic.NET不要进行任何强制的类型转换。当然,VB.NET也不是完全限制了类型自动转换:它允许进行向下的自动类型转换(Cast),但不支持向上的自动类型转换。例如,如果不是使用“sngvariable = CSng(dblvariable)”这类语句进行显式的类型转换,声明为Single的变量不能设置为Double变量的值,因为它可能导致数据丢失;然而,Double变量可以直接设置为Single类型变量的值,且无需显式地进行类型转换,因为这里不存在数据丢失问题。使用Option Strict能够帮助开发者减少许多错误,包括许多难以调试的错误。附带说明:使用Option Strict时不允许再使用延迟绑定。
本文主要简单介绍了VB.NET语法的一些使用以及注意事项,希望对大家的学习带来收益。
【编辑推荐】