从过去到未来、 从Visual和Basic到Net(三)
10. 运行时动态的创建控件。VB。NET不再象VB6那样直接支持控件数组了,用VB。NET会有不同的实现办法和需要更多的代码,VB。NET的实现机制有些象Java的实现了。一直很怀疑MS是否把以前VJ中的WFC直接搬到VS。NET中。过去的VB======================================================Private Sub cmdAddButton_Click(Index As Integer)Static counter As Integercounter = counter + 1If counter < 4 ThenLoad cmdAddButton(counter)With cmdAddButton(counter - 1)cmdAddButton(counter).Move _.Left + .Width + _(10 * Screen.TwipsPerPixelX), .TopEnd WithcmdAddButton(counter).Visible = TrueEnd IfEnd Sub现在的VB.NET======================================================(第一种实现)Private Sub btnAddButton_Click(ByVal sender As _System.Object, ByVal e As System.EventArgs) _Handles btnAddButton.ClickStatic counter As Integer = 1Static lastButton As System.Windows.Forms.Buttoncounter += 1If lastButton Is Nothing ThenlastButton = btnAddButtonEnd IfIf counter < 4 ThenDim b As New System.Windows.Forms.Button()With lastButtonb.Width = .Widthb.Text = .TextControls.Add(b)b.Left = .Left + .Width + 10b.Top = .ToplastButton = bEnd WithAddHandler b.Click, AddressOf Me.btnAddButton_ClickEnd IfEnd Sub( 第二种实现)Private Sub btnNewAdd_Click(ByVal sender As _System.Object, ByVal e As System.EventArgs) _Handles btnNewAdd.ClickDim b As New System.Windows.Forms.Button()With senderb.Width = .widthb.Text = "Click Me!"Controls.Add(b)b.Left = .Left + .Width + 10b.Top = .TopEnd WithAddHandler b.Click, AddressOf Me.newButtonClickEnd Sub使用GetChildIndex来获得控件数组中的控件。Private Sub newButtonClick(ByVal sender As _System.Object, ByVal e As System.EventArgs)MsgBox("A new button was clicked! The index of " _" this button is: " & Me.Controls.GetChildIndex _(sender))End Sub11. 变量和数组的定义。VB6的变量定义是很神奇的,开始用VB时,我一直以为 Dim X , Y as String 是一样的。等知道不同时也不喜欢用 Dim X as String , Y as String 来定义、宁愿分两行定义。现在的VB。NET中在同一语句中定义的变量必须是同种类型,也就是说Dim X as Integer , Y as String 已不在允许了。最让我满意的是VB。NET开始支持这样的语法: dim x As integer = 24 ,等了它许多年了。数组的定义,特别是初始化也改进了不少,现在可以在定义的同时赋值进行初始化,省去定义一个循环变量和做一个For循环,而且数组的下标是基于零了,突然数组只可以是基于零的下标,这下所有数组都由零开始了。过去的VB======================================================Dim X as IntegerX = 100Dim MyArray( 10 ) as Integer ( 实际有11个元素)For i = 0 To 10MyArray ( I ) = INextDim MyArray1( 10 ) as IntegerDim MyArray2(10) as IntegerFor i = 0 To 10MyArray 1( I ) = INextFor i = 0 To 10MyArray 2( I ) = MyArray1( I )Next现在的VB.NET======================================================Dim X as Integer = 100Dim MyArray ( 10 ) as Integer = ( 0,1, 2, 3, 4, 5, 6, 7,8 , 9 ) (共10个元素)Dim MyArray1(10) as Integer = ( 0,1, 2, 3, 4, 5, 6, 7,8 , 9 )Dim MyArray2(10) as Integer = MyArray112. 开始支持结构化的错误处理,引进了新的Try 、Catch 、Finally 语句而且也有了Throw 表达式,这样在多层的错误处理中你可以少写许多On Error GoTo 不要再费心GoTo的满天飞了。VB。NET仍然也支持原来非机构的错误处理语句比如有趣的 On Error GoTo 0 、 On Error resume Next 等等。不过一个函数中同时存在结构和非结构的错误处理代码时看起来一定非常有趣。就象新版帝国2中的农民一样,代码防御力增加Double。总的来说VB.NET比以前的VB要简洁和更少的代码,但也需要你了解更多的对象和对象的方法。不能说VB。NET比VB好或不好,有时我想把VB和VB。NET看做根本是两种不同的语言,也许会更实际一点,这样我们就不会妄想目前的VB程序进行小小的修改就可以在dotnet的平台上运行了。虽然目前所有正在运行的应用都不可能简单的升级到dotNet,不过这并不妨碍你多学习一门语言,接受一种变化;事实上无论VB如何发展,对于你来说掌握和适应Visual Studio.NET都将是一个曲线的演变,不管是现在还是未来。