7.介绍VB.NET
VB.net 或者说 VB7 有许多和旧版本的Visual basic 一样的语法,但是在许多方面,它是一门全新的语言。和VB先前的版本不一样,VB7是完全的面向对象的,一些普通的操作的实现因为这个不同而出现一些区别。出于这种原因,与其将它当成一个编译器来编译你已经写好的程序,不如最好将VB.NET当作是一种开发.NET应用程序的语言。由于VB.NET的格式还是不成熟的,因此在本文中当我们谈到VB.NET时,我们将用VB7来命名VB.NET。(我们将在小标题中延续VB.NET的名字),然而,这本章中我们将要看到VB7的优势。在下一章中,我们将要看到它多么简单地订制设计模式来构筑有用的面向对象的VB程序。
VB.NET的语法不同
在这个版本中的主要的不同点是那些子程序和类方法必须加上圆括号。在VB6中我们能这样写:
Dim myCol As New Collection
MyCol.Add "Mine"
然而,在VB7中,你必须在参数上添加括号:
Dim myCol As New ArrayList
MyCol.Add ("Mine")
另一个显著的不同,对大多数人来说是一个改进工作,参数传入子过程默认是用传值来代替传址。换句话说,你能操作变量在子程序中而不必担心在调用它的程序中的变量值会改变。再换句话说,以前要被修正的“ByVal”现在是默认的了。实际上,开发环境在大多数情况下自动从你的程序插入传值参数到调用的子程序中,如果你想要在程序中改变值,你依然能声明是一个参数,修正为传址的。
四个其他的VB6的关键字也被去除或显著的改变了:Set, Variant, Wend, EndIf。事实上,开发环境只是去除了动词Set在任何你使用它的行的开始处。
从现在开始,Dim声明允许你将属于同一个类型的几个变量中同时在一个单一的声明中列出。
Dim x, y As Integer
你不再能够在同一个单一的声明中列出不同类型的变量。
Dim X as Integer, Y As Single 'Illegal in VB7(VB7中非法)
你现在必须在不同的行中列出它们
Dim X as Integer 'legal in both vb6 and vb7
Dim Y as Single
VB7的编译器将把许多的VB6上的构造用法标示为错误的。然而,它会简单地忽略附加的“AS”声明在同一个Dim声明行。另外,字符函数Instr, Left 和 Right 已经被字符类方法 indexOf 和 substring 进行了补充替代了,使之变得更万能。注意那些以0作为字符索引下标的方法。
VB6 VB7
Instr(s, ",") s.indexOf(",")
Left(s, 2) s.substring(0,2)
Right(s, 4) s.substring(s.Length() 4)
改进的函数语法
在VB中,在从一个函数返回值时,需要提供函数名
Public Function Squarit(x as Single)
Squarit = x * x
End Function
在VB7中,着这个限制最终被取消了,你能象在其他语言中一样简单地返回函数值:
Public Function Squarit(x as Single)
Return x * x
End Function
这使得函数更容易被定义和使用。
在VB.NET中的对象
在VB7中,任何东西被当成对象。当在VB6中,你能够创造一个类实例,将它当对象来使用。对象能通过包含的数据和方法来操作。在VB7中,所有的变量都真是这样的。.举例说明,字符也是对象,它们有这样的方法:
Substring
ToLowerCase
ToUpperCase
IndexOf
Insert
ToSingle
ToInt32
再深入一点,Integers , Single 和 Double 变量也是对象,它们有方法
Dim s as String
Dim x as Single
x = 12.3
s = x.toString
实际上,你甚至能将常量也当成对象来对待
Dim snum as String
Snum = 9.toString
注意到,现在字符和数字类型的转换能使用对象方法了,不需要象以前那样用Val 和Str函数了。如果你想要将一个数字格式化成一种字符,每一种数字类型有一个格式化方法:Dim s as StringDim x as Single
x = 12.34
s = Single.Format(x, "##.000")
VB.NET中的数
所有的没有小数点的数都被假定成Int32类型,所有小数点的数都被假定成Double类型。如果你想要将一个Single变量定义成一个小数,你必须在数字的后面跟上一个“F”(浮点)。
Dim time As Single = 123F
一般地说,VB.NET的编译器要求变量声明用以防止大多数的不清楚的类型转化(除去转化成更宽的类型)。你总是能够将Integer转化成Single和Double类型。然而,如果你想要将Single转化成Integer,你就必须明确提出你的意思。
Dim k As Integer = time.ToInt16
VB6和VB.NET 的属性
Visual Basic提供了一种结构叫属性,类似于其他语言中的getXxx和setXxx方法。在VB6中,你能够用名字指明一个属性,定义Get和Let方法。这俩个方法允许你给一个私有变量赋值,并允许你取得它的值。
Property Get fred() As Stringfred = fredNameEnd Property
Property Let fred(s As String)fredName = sEnd Property当然,你能够在前期和后期处理中使这些数据生效或将它们转化成需要的形式。
在VB7中,这些属性被组合成一个单一的程序:
Property Fred() As StringGetReturn fredNameEnd GetSetfredName = valueEnd SetEnd Property
注意这些关键值。我们将在VB7中用它来被传入属性的值。因此如果我们这样写
Abc.Fred = "dog"
然后,当属性中的Set代码被执行时,字符变量的值将包含“dog”。
在两者的系统中,这个效果用来提供一个简单的接口,它可以在不知道数据如何确切存储的时候从类中取出数据或将数据存入类中。你能使用这些共同分配声明的属性。如果“Fred”是一个Boy类的属性,那么,你能这样写声明:
Dim kid as Boy
Kid.fred = "smart"
然后
Dim brain as string
Brain = kid.fred
一般说来,属性系统提供了一个交替的语法让你能不费力地写getFred和setFred函数。当语法不同时,除了本地的VB对象有胜于get和set方法之外,没有什么显而易见的优势。在这本书中,我们将不会太多使用这种属性,因为它们不是在写面向对象的程序代码时的重大的优势。
速记平等语法
VB7采用了我们能在 C,C++,C#和Java中能发现的速记平等语法。它允许你不用在将一个变量加,减,乘,除一个常数时,写两次变量名。
i += 5 'add 5 to i
i -= 8 'subtract 8 form i
i *= 4 'multiply i by 4
你能用这种途径来减少写代码,但这种代码确实和你用老的方式写的代码产生同样的效果
i = i + 5
i = i - 8
i = i * 4
这同样的应用也可以用于除法,但你几乎看不到这样的用法,因为它们可读性较差。
管理语言和内存回收
VB.NET 和 C# 都是管理语言。它们有两个重要的含意。首先,它们都被编译成一个中间的低级语言,一种公共的语言运行时间(CLR)被用来执行编译过的代码,或许在更早时就完成了编译。因此,不但VB7而且 C#同时分享了运行时间库,它们很大程度上就象一枚硬币上的两个面,一个语言系统上的两个方面。他们的不同点是VB7更象是Visual Basic,它更容易学习和使用。C#更象C++和Java,有这些语言经验的程序员更倾向于用C#。
另一个管理语言的含意是内存回收。内存回收语言将自动释放不用的内存,使你不必关心这个问题。当内存回收系统发现一个变量,数组,对象不再被使用,它将释放内存给系统。你再也不需为因为分配内存而未及时释放而造成内存不够而紧张。当然,大量消耗内存的代码还是有可能存在的,但大多数情况下,你不必为分配和释放内存而担心了。
VB.NET中的类
类是VB7中一个很重要的部分。几乎每一个重要的程序中都包含一个或多个类。在VB7中类和窗体之间的区别已经消失了,许多程序将全部由类构成。既然每一个东西都是类,那么类对象的名称的数量将是无法控制的。他们被分组在多个不同功能的库文件中,在使用库时,你必须十分明确指出他们的位置。
从深层次上看,这些库都是彼此独立的动态链接库。然而,你仅仅需要用他们的基础的名称来引用他们,然后这些库中的所有函数你都可以用了。
Imports System.Collections 'Use Collection namespace classes
理论上,每一个库都有一个不同的名称空间,每一个名称空间都包含了一个独立的类和方法名称的组,当你引用了名称空间之后,编译器会认出你所要用的类函数或方法。但在你引用了多个包含有相同的类和方法名的名称空间后,当你试着用一个在多个名称空间中都有的同名函数或方法时,你将被告知有冲突。
最常用的名称空间是系统内部名称空间,你不需要引用这些默认的名称空间。它包含了很多的基础的类和方法在VB7中将要被使用的,例如,应用程序,数组,控制台,异常,对象和字节,逻辑,单精度数和双精度数,字符等标准对象。在最简单的VB7程序中我们能够在控制台上打印“Hello VB World”而不需要建立窗口:
Imports System 'this one is optional
'Simple VB Hello World program
Public Class cMain
Shared Sub Main() 'entry point is Main
' Write text to the console
Console.WriteLine ("Hello VB World")
End Sub
End Class
着个程序仅仅在命令(DOS)窗口上打印“Hello VB World”。任何程序的入口处必须是一个Main函数,在一个模块中,它必须被声明成共享的。在VB7中从前的模块类型只有Module类型。程序能这样写:
'Simple VB Hello World program
Public Module cMain
Sub Main() 'entry point is Main
' Write text to the console
Console.WriteLine ("Hello VB World")
End Sub
End Module
除了一个模块拥有共用的(共享的)方法,Main函数不用声明成共享的以外,一切都一样。VB7中的模块类似与以前的模块,它们都会被VB生成一个.bas类型的文件。他们有一个优势就是在模块中被声明的方法和变量常量能够在整个程序中被使用。然而,和类不同,他们没有提供可以隐藏信息和运算法则的方法,下面将不再介绍和使用了。
在VB6,类名通常声明了文件名,尽管你可以修改类名的属性。在 VB7中,类的关键字允许你而不需考虑文件名,实际上,你必须为每个类声明一个类名。在VB6中类的默认扩展名是.cls 窗体的默认扩展名是.frm。在VB7中你能够使用任何扩展名,但默认的是.vb。
建造一个VB7应用程序
让我们从建造一个简单的控制台应用程序开始:那是一个没有任何窗口应用程序,他仅仅以命令行的方式运行。打开Visual Studio.NET程序,选择File|New project。从选择框中选择控制台程序就象 图7-1中所示:
图7-1 在新工程的选择框中选择一个控制台应用程序
这样将生成一个模块,已经有了Main过程,现在请加入以下代码:
Module cMain
Sub Main()
'write text to the console
Console.WriteLine("Hello VB world")
End Sub
End Module
你能按F5编译和执行这个程序。如果你想改变这个程序的主模块的名字就象我们做的那样,从Module1到cMain,你将不得不在启动模块的选项中改变模块名。为了这样做,在Solution Explorer浮动面版中右单击工程名,从弹出菜单中选择Properties选项,将会出现图7-2 工程的属性页:
你能在下拉式菜单中选择正确的新名称。当你按F5 编译程序时,一个DOS 将出现并打印信息“Hello VB World”,然后退出。
你也能删除这个模块,用插入一个类来代替。
Public Class cMain
Shared Sub Main()
Console.WriteLine("Hello classy VB world")
End Sub
End Class
这个能用同样的方式编译和运行。
图7-2 工程的属性页
在VB.NET中编写最简单的窗口程序
写一个有窗体框架的程序是很简单的。实际上,你能用Windows Designer创建大多数的应用程序。为了这样做,打开Visual Studio.NET,选择File|New project,然后选择Windows Application。默认的文件名称是WindowsApplication1,但在你关闭新建对话框前,你能改变名称。这样就建立了一个简单的工程,初始化了Form1.vb的窗体。然后你能用工具箱在窗体上添加控件就象在VB6中那样。
在图7-3中 窗体设计中有一个含有俩个标签,一个文本框,一个按钮的简单窗体你能将控件放在窗体上,通过双击控件来进入代码设计。在这个简单的窗体上,我们单击“Say hello ”按钮,他将文本框中的内容复制到空白的我们命名为 lbHi的标签中,然后清空文本框。
Protected Sub SayHello_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
lbhi.Text() = txhi.Text
txhi.Text = ""
End Sub
代码的生成可能有点不同。注意单击动作传入了一个接收对象(Sender)和一个事件对象(e),让你能询问进一步的信息。运行时的程序如图7-4所示。
图7-3 Visual Studio.NET的窗体设计
图7-4 简单的 Hello 程序的按下 Say Hello 按钮前后的效果
虽然我们只需要写俩行代码到上面的子过程,但看一下程序中剩下的代码和以前的不同还是很有意义的。首先我们看到几个类库被引入了程序使得整个程序都可以用到它们:
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
最重要的是WinForms这个类库,它是整个.NET共同使用的。你能在C#(C-sharp)和C++用VB 的窗体设计。
继承
接下来,我们必须来看一下VB-7中最好的改变:继承。
Public Class HelloForm
Inherits System.WinForms.Form
我们现在建立的窗体是Form 类的一个子类,并不是象以前的VB 版本那样只是一个类的实例。这就有了很大的意义。你能创建可视化的对象,通过重载属性来使得它们有不通的功能。我们将简略地看一些例子。