单元五 VB.NET语言基础
[学习目标]初步掌握Visual Studio.NET程序的书写规则、基本的数据类型、变量、常量、运算符、表达式、常用函数、流程控制、过程、程序调试和异常处理和面向对象的程序设计等知识。通过实例进一步巩固利用VB.NET(简称VB.NET)开发Windows应用程序的流程。加深理解解决方案、项目与项的含义,并了解利用解决方案及项目对开发进行管理的基本方法。
从前几章的学习可以看出,一个VB.NET程序由两个部分构成:一部分是程序的应用界面,另一部分是程序代码。程序的应用界面正是通过程序代码将界面中的各个对象有机地结合起来,从而实现程序所需要的功能。与其他任何程序设计语言一样,VB.NET也规定了可编程的数据类型、基本语句、函数与过程等。
对于已经学习过VB或其他编程语言的读者来说,本章的许多内容是不陌生的,因此学习时只要快速浏览一下即可。而对于没有编程语言基础的读者来说,本章则应是学习的重点。
5.1 VB.NET程序设计基础
5.1.1 代码书写规则
VB.NET程序设计语言的代码书写规则如下:
1. 关键字和标识符
关键字又称是系统保留字,是具有固定含义和使用方法的字母组合。关键字用于表示系统的标准过程、方法、属性、函数和各种运算符等。如:Private、Sub、If、Else、Select等等。
标识符是由程序设计人员定义的,用于表示变量名、常量名、控件对象名称等的字母组合。
VB.NET中标识符的命名规则:
(1) 标识符必须以字母或下划线开头;
(2) 标识符中不能出现空格和符号;
(3) 不能使用关键字。
例如,以下为错误的标识符:
Public(错误原因:使用了系统保留字);
Student name(错误原因:标识符中出现了空格);
505Ccomputer(错误原因:标识符以数字开头);
2. 代码书写规则
程序语句是执行具体操作的指令,是程序的基本功能单位。程序语句最长不能超过1023个字符。例如:
End
TextBox.Value="Hello"
程序代码的书写规则如下:
(1) 不区分字母的大小写;
(2) 一句语句中包含的字符数不能超过1023个字符,一行中包含的字符数不能超过255个字符;
(3) 一行可书写若干句语句,语句之间用":"分隔;
(4) 一句语句分若干行书写时,要用空格加续行符"_"连接;
(5) 同一语句的续行符之间不能有空行;
(6) 不能在对象名、属性名、方法名、变量名、关键字的中间断开;
原则上,不提倡一行写多条语句,续行符应该加在运算符的前面或后面
3. 注释
加入注释语句的目的是为了便于阅读程序代码,以方便程序的维护的调试。注释语句可用REM或"'"引导。在调试程序时,通常可以在语句前加上"'",以使该语句在程序运行时不被执行。注释语句的各种用法如下:
' 以下语句有作用是定义一个变量
REM 以下语句有作用是定义一个变量
Dim studentno as int ' 定义一个学生学号的变量
Dim studentno as int REM 定义一个学生学号的变量
TextBox.Value="Hello"
利用文本编辑器工具栏对某一个程序段整个加上注释。方法是先选中需要注释的代码段,单击编辑工具栏中的"块注释"按钮,如要取消注释,只要再单击"取消块注释"按钮即可。这种注释特别有利于程序的调试。
5.1.2 基本数据类型
Visual Basic.NET语言定义了多种数据类型,用以存储各种不同形式的数据,节省存储的空间。
Visual Basic.NET常用的数据数据类型如表5-1。
表5-1 常用数据数据类型
VB.NET 公共语言运行库类型结构 名义占字节数 取值范围
Boolean System.Boolean 2 True 或 False
Byte System.Byte 1 0到255(无符号)
Char System.Char 2 0到65535(无符号)
Date System.DateTime 8 0001年1月1日凌晨0:00:00到9999年12月31日晚上11:59:59
Decimal System.Decimal 16 0到±79,228,162,514,264,337,593,543,950,335之间不带小数点的数;0到±7.9228162514264337593543950335之间带28位小数的数;最小非零数为±0.0000000000000000000000000001
Double(双精度浮点型) System.Double 8 负值取值范围为-1.79769313486231570E+308到-4.94065645841246544E-324;正值取值范围为4.94065645841246544E-324到1.79769313486231570E+308
Integer System.Int32 4 -2,147,483,648到2,147,483,647
Long(长整型) System.Int64 8 -9,223,372,036,854,775,808到9,223,372,036,854,775,807
Object System.Object(类) 4 任何类型都可以存储在Object类型的变量中
Short System.Int16 2 -32,768到32,767
Single(单精度浮点型) System.Single 4 负值取值范围为-3.4028235E+38到-1.401298E-45;正值取值范围为1.401298E-45到3.4028235E+38
String(变长) System.String(类) 大约20亿个Unicode字符
用户自定义的类型(结构) (从System.ValueType继承) 结构中的每个成员都可以由自身数据类型决定取值范围,并与其他成员的取值范围无关
VB.NET中的数据类型与VB相比有两点不同:一是所有的数据类型都是对象;二是许多数据类型(特别是整型)的取值范围扩大了。
5.1.3常量与变量
1. 常量
所谓常量是指在整个应用程序执行过程中其值保持不变的量。常量包括直接常量和符号常量两种形式。
(1) 直接常量
在程序中直接给出的数据,包括数值常量、字符型常量、布尔常量、日期常量等。
各类常量的表示方法如下:
数值常量:23、235、65、23.54、0.345、234.65。
字符型常量:"A"、"a"、"t"、"张毅"、"上海"、"VB.NET程序设计"。
布尔常量:True、False。
日期常量:#10/21/2006#、#1/31/2000#。
(2) 符号常量
在应用程序实际中,使用的一些固定不变的数据,如固定的数学常量π,就应该考虑改用常量。声明符号常量,使用Const语句来给常量分配名字、值和类型。
定义符号常量的一般格式如下:
Const <常量名> [As 数据类型] =表达式]
[功能] 定义由"常量名"指定的符号常量。
[说明] 常量名是标识符,它的命名规则与标识符的命名规则一样。"As数据类型"用来说明常量的数据类型。
2. 变量
在VB.NET中,变量就是用来存储在应用程序执行时会发生变化的值。一个变量在内存中占据一定的存储单元,一个变量中可以存放一个数据。每个变量应有一个名字。
在使用变量之前,应先声明变量。在声明变量的同时还可以给变量赋初值。
变量声明语句的一般格式如下:
Dim <变量名> As 数据类型 [=初值]
[功能] 定义由"变量名"指定的变量,并可以给它赋初值。
[说明] 语句中的"Dim"可以是Declare,Public,Protected,Friend,Private,Shared和Static。本节只介绍Dim。
在VB.NET中的变量的声明分为显式声明(先声明后使用)与隐式声明(不声明直接使用)两种,但一般推荐使用显式声明。
初值用来定义变量的初值。如果在声明变量的时候没有给变量赋初值,VB.NET就用数据类型的默认值来给出初始值。
例如:
Dim aa as integer =100 ' 将变量aa 声明为整型变量并将初值设置为100。
Dim StudentName as String ="张毅" ' 将变量aa 声明为字符型变量并将初值设置为"张毅"。
在V B.NET中,变量的命名应符合标识符命名规定。
VB.NET中变量的命名规则:
(1) 变量必须以字母或下划线开头;
(2) 变量中不能出现空格和符号;
(3) 变量不能使用关键字。
3. Option Explicit语句
(1) Option Explicit的工作方式
当Option Explicit设为On时(这是缺省情况),必须在使用变量前显示声明该变量,否则将产生编译错误。
当Option Explicit设为Off时,可以在代码中直接使用变量,即隐式声明该变量。这时该变量作为对象类型创建。虽然隐式声明变量比较方便,但会增加命名冲突和隐藏拼写错误并且会抵消使用内存。
(2)设置Option Explicit
在代码最前面编写相应的语句,可以将Option Explicit设为On或Off:
Option Explicit On ' 将Option Explicit设为On
Option Explicit off ' 将Option Explicit 设为off
如果使用隐式声明变量,VB.NET会将遇到的每一个没有声明的标识符均看成一个变量。
例如:在没有声明X和Y的前提下,有下列语句:
x=314
y=250
系统将自动创建X和Y这两个变量。
5.1.4运算符和表达式
VB.NET中也具有丰富的运算符,通过运算符和操作数组合成表达式,实现程序编制中所需的大量操作。VB.NET中的运算符可分算术运算符、关系运算符、逻辑运算符和字符串运算符四类,相应的表达式也可分为算术表达式、关系表达式、逻辑表达式和字符串表达式等。
(1)算术运算符和算术表达式
算术运算符可以对数值型数据进行幂(^)、乘法(*)、除(/)、整除(/)、取余(Mod)、加法(+)和减法(-)等运算。算术运算符运算规律见表5-2。
表5-2 算术运算符运算规律
运算符 名称 优先级 实例 a=3 结果
^ 乘方 1 a^2 9
- 负号 2 -a -3
* 乘 3 a*a*a 27
/ 除 3 10/a 3.333333
/ 整除 4 10/a 3
Mod 取余 5 10 mod a 1
+ 加 6 10+a 13
- 减 7 10-a 7
在VB.NET中也引入了类似C语言的反目赋值运算:
在VB.NET中新增了一些新的算术符"+="、"-="、"&="等,其功能如下:
VB.NET VB6.0
X+=4 X=X+4
X- =4 X=X-4
X/=4 X=X/4
X/=4 X=X/4
X^=4 X=X^4
X&="ok" X=X & "ok"
(2)关系运算符
关系运算符也称比较运算符,用来对两个相同类型的表达式或变量进行等于(=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、不等于(<>)、字符串比较(Like)和对象引用比较(Is),其结果是一个逻辑值,即True和False。关系运算符运算规律见表5-3。
在比较时注意以下规则:
l 如果两个操作数都是数值型,则按其大小比较
l 如果两个操作数都是字符型,则按字符的ASCII码值从左到右逐一比较。
l 关系运算符的优先级相同。
l VB.NET中,Like比较运算符用于字符串匹配,可与通配符"?"、"#"、"*"结合使用。
表5-3关系运算符
运算符 名称 实例 结果
= 等于 "ABCDE"="ABR" False
> 大于 "ABCDE">"ABR" False
>= 大于等于 "bc">="大小" False
< 小于 23<3 False
<= 小于等于 "23"<="3" True
Like 字符串匹配 "ABCDEFG"Like"* DE" True
IS 对象引用比较 ClassSample 1 is Nothing True
通配符"?"、"#"、"*"的作用:
"?":表示任何单个字符;
"#":表示任何单个数字(0 到 9);
"*":表示零或更多字符;
(3) 逻辑运算符
逻辑运算也称布尔运算,有与(And)、或(Or)、非(Not)、异或(Xor)等操作。逻辑运算规律见表5-4。
表5-4逻辑运算符
运算符 名称 结果
Not 逻辑非 当操作作数为假时,结果为真,反之亦然
And 逻辑与 A和B都是True时,结果才为T
Or 逻辑或 A和B都是False时,结果才为F
Xor 逻辑异或 两个操作数的值不相同,结果为T,相同时结果为F
AndAlso 简化逻辑合取 当A为False时,结果为False;当A为True时,结果与B相同;
OrElse 短路逻辑析取 当A为True时,结果为True;当A为False时,结果与B相同;
(4) 字符运算符
字符串运算符有"+"和"&"两个运算符,用来连接两个或更多个字符串。"+"要求参加连接的两个字符串必须均为字符串数据,"&"可以把不同类型的数据转变成字符串来连接。
例如: "中国" + "上海"="中国上海"
"中国上海" & 2010="中国上海2010"
5.1.5常用函数
VB.NET中提供了许多具有一定功能的内置函数供开发人员直接调用。函数通常有一个返回值,按返回值的数据类型可以将VB.NET中的函数分为:数学函数、字符处理函数、类型转化函数、日期时间函数。
VB.NET中的函数与VB6函数并不一一对应,有些VB6中的函数在VB.NET已经不支持或已经变成了方法。
(1) 数学函数
数学函数包含在Math类中,使用时应在函数名之前加上"Math",如Math.sin(3.14)。也可以先将Math命名框架引入到程序中,然后直接调用函数即可。引入命名空间在类模块、窗体模块或标准模块的在声明部分使用Imports语句,如导入Math命名空间,可使用如下语句:Imports System.Math
另外在Math类中还定义了两个重要的常数-Math.PI(圆周率-3.14159265358979323846)和Math.E(自然对数底--2.7182818284590452354)。
Math类中的常用函数有Abs()、Sin()、Cos()、Round()、Sqrt()、Sign()、Exp()、Log()、Max()、Min()等。
(2) 字符处理函数
字符处理函数可以直接调用,常用的字符处理函数有Ltrim()、Rtrim()、Trim()、Mid()、Left()、Len()、Ucase()、Lcase()、Space()等。
产生一个0~1(不包括0和1)之间的单精度随机数。当X小于0时,总产生随机数,当X等于0时,总产生上一次产生的随机数,当X大于0时,产生序列中的一个随机数。X值可以缺省,缺省时与X大于0等价。通常使用该函数之前,用Randomize初始化,然后使用不同参数的Rnd()函数。Randomize语句使随机数生成器具有一个基本统计时器的种子。
表5-5 常用函数
类 型 函 数 名 功 能 举 例 结 果
算术函数 Abs(N)Rnd([N])Sqr(N) 取绝对值产生随机数平方根 Abs(-12.34)RndSqr(16) 12.340~1之间的任意数4
转换函数 Asc(C)Chr[$](N)Str[$](N)Val(C) 转换成ASCII值ASCII值转换为字符数值转换为字符字符转换为数值 Asc("A")Chr(65)Str(45.90)Val("23.4a") 65"A""45.9"23.4
字符串函数 Len(C)Left[$](C,n)Right[$](C,n)Ltrim[$](C)Rtrim[$](C)Mid[$](C,n1,n2)InStr(C1,C2)Ucase[$](C)Lcase[$](C) 字符串长度取字符串左边n个字符取字符串右边n个字符去掉字符串左边的空格去掉字符串右边的空格从n1位开始取n2个字符在字符串C1中查找C2将C转换成大写字母将C转换成小写字母 Len("Visual Basic")Left("Visual Basic",6)Rigth("Visual Basic",5)Ltrim(" Basic")Rtrim("Visual ")Mid("Visual Basic",9,2)InStr("Visual","a")Ucase("Visual")Lcase("Visual") 12"Visual""Basic""Basic""Visual""as"5VISUALvisual
日期函数 Date[$]Time[$]Day(C|N)Month(C|N)Year(C|N) 取系统日期取系统时间取日期值取月份值取年份值 DateTimeDay("07/13/2001")Month("07/13/2001")Year("07/13/2001") 当前日期当前时间1372001
5.2流程控制
与其他程序设计语言一样,VB.NET的程序结构也可分为顺序结构、分支结构和循环结构三种结构。
5.2.1顺序结构
顺序结构是一种最简单的程序结构,各语句按排列的先后顺序执行。
【案例5-1】编写一个解一元二次方程 AX2+BX+C=0的程序,其中之一A、B、C三个参数满足条件≥0。
本案例是一个解一元二次方程 AX2+BX+C=0的程序,其中之一A、B、C三个参数满足条件B2-4AC≥0。A、B、C三个参数使用InputBox语句输入,方程的二个解通过MsgBox语句输出。相关界面见图5-1.
(a) (b)
(c) (d)
图5-1 案例5-1界面
[技能目标]
1. 掌握顺序结构的程序流程。
2. 掌握赋值语句、Input语句和MsgBox语句的使用。
[操作要点与步骤]
1. 新建一个项目"Vbnet5-1"
2. 在窗体上建立一个命令按钮
3. 双击命令按钮,进入代码编写窗口
4. 输入以下代码
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
Dim a As Integer
Dim b As Integer
Dim c As Integer
Dim x1 As Single
Dim x2 As Single
a = InputBox("输入A的值:","解一元二次方程")
b = InputBox("输入B的值:","解一元二次方程")
c = InputBox("输入C的值:","解一元二次方程")
x1 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a)
x2 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a)
MsgBox("x1=" & x1 & Chr(13) & Chr(10) & "x2=" & x2)
End Sub
数学函数包含在Math类中,使用时应在函数名前加上"Math",或在程序中导入Math命令空间。Imports system.math
[相关知识]
InputBox函数提供了一种和用户交互的语句,在对话框中显示提示信息,等待用户输入文本和单击按钮,返回包含相关内容的字符串。
InputBox函数用来接收键盘的输入,例如以下的语句将显示如图5-2所示的输入框:
strName=InputBox("请输入要查找的姓名:","输入")
其典型使用格式为:
InputBox(prompt[,title] [,default] [,xpos] [,ypos] )
prompt是输入框中的提示文字,如"请输入要查找的姓名",title为输入框的标题,如"输入",default为显示在输入文本框中的默认内容,省略则显示空串,xpos,ypos是输入框在屏幕上显示的位置坐标。
从图5-2可以看出,该函数的作用是打开一个对话框,等待用户输入信息,信息输入完成后单击"确定"或按回车键,函数将返回文本框中输入的字符型值并赋给指定的变量。在图5-2中如输入"张三"后按回车键,则strName变量中的内容即为"张三"。
在使用该函数时,除了第一项提示外都是可以省略的,但要注意如果省略一部分参数,被省略的参数必须用占位符--逗号跳过。
该函数在使用时要注意以下几点:
(1) 提示文字的最大长度为1 024个字符,在对话框中显示这些提示信息时会自动换行。如果想按自己的要求换行,必须在提示信息中插入回车换行来实现。例如:将提示信息写成:"请输入要查找的姓名"+ Chr(13)+Chr(10) +"按确定按钮或回车键结束"。执行后将在对话框中显示两行文字。其中的Chr(13)+Chr(10)也可以用VB的常量"vbCrLf"来代替。
(2) 默认情况下该函数的返回值为字符串型,如果用户没有输入而直接按回车,则会返回为空字符串。
(3) 如果需要接受一个数值(如年龄、成绩等),则通常要将接收返回值的变量声明成一个数值类型的变量。如果事先没有声明则该变量仍然是一个字符型,因此在使用该变量前一般要进行转换以防止类型不匹配的错误。另外,如果已将该变量声明成数值型变量,为防止出现运行错误,一般要设置default参数以保证用户不输入也有一个默认的数值返回到变量中。
(4) 该函数在运行时还有一个"取消"按钮,用于将输入的值作废,相当于按ESC键,此时将返回一个空串。
(5) 每次调用该函数只能输入一个值,如果需要连续输入多个值,必须将该函数与循环语句联合使用,每调用一次将输入的数据保存下来后(通常是存放到一个数组中)再次调用。
在Windows及其应用软件中,消息框的使用非常频繁,像警告信息、提示信息、确认信息等。VB.NET也提供了消息框功能,如图5-3所示的询问消息框就是用MsgBox函数实现的。
MsgBox的主要格式如下:
MsgBox(prompt[,buttons] [,title])
prompt指消息框中的提示信息(与InputBox函数的使用相同),如图5-3中"继续吗?";buttons定义消息框中的按钮类型、数目及图标样式;title即消息框的标题,如图5-3中的"询问"。
应用MsgBox时最主要的是确定第二项参数,该参数共有4组,即为4项参数之和:"按钮数目值"+"图标类型值"+"缺省按钮值"+"模式值",有两种取法,一种是直接用4个取值相加,另一种是用4个内部常量相加。按钮参数值的取法见表5-6。
表5-6 buttons设置值及意义
参 数 内部常量 取 值 描 述
按钮数目 VbOKOnlyVbOKCancelVbAbortRetryIgnoreVbYesNoCancelVbYesNoVbRetryCancel 012345 只显示确定按钮(缺省)显示确定与取消按钮显示终止、重试与忽略按钮显示是、否与取消按钮显示是与否按钮显示重试与取消按钮
图标类型 VbCriticalVbQuestionVbExclamationVbInformation 16324864 显示关键信息图标(红色STOP标志)显示询问信息图标(?)显示警告信息图标(!)显示普通信息图标(i)
缺省按钮 VbDefaultButton1VbDefaultButton2VbDefaultButton3 0256512 第一个按钮为缺省按钮第二个按钮为缺省按钮第三个按钮为缺省按钮
模式 VbApplicationModelVbSystemModel 04 096 应用模式(缺省)系统模式
图5-3的消息框可用下列命令之一实现:
intRet=MsgBox("继续吗?",VbYesNoCancel+VbQuestion,"询问") '用内部常量
intRet=MsgBox("继续吗?",3+32,"询问") '用数值
命令执行后,函数有一个返回值送到变量intRet中,返回值取决于用户响应了哪一个按钮,各个按钮对应的返回值见表5-7,程序可以根据用户响应的按钮所返回的值决定程序的流程。
响应按钮名 内部常量 返 回 值
确定取消终止重试忽略是否 VbOkVbCancelVbAbortVbRetryVbIgnoreVbYesVbNo 1234567
5.2.2分支结构
在VB.NET中提供了多种形式的分支结构语句,根据条件是否为真,执行不同的分支的语句,它又称为选择结构。
【案例5-2】案例5-1续:编写一个解一元二次方程 AX2+BX+C=0的程序,当B2-4AC≥0时,通过MsgBox语句输出方程的解;否则,通过MsgBox语句输出"无实数解"。相关界面见图5-4。
[技能目标]
1. 掌握IF分支结构的程序流程。
2. 进一步掌握赋值语句、InputBox函数和MsgBox函数的使用。
图5-4案例5-2界面
[操作要点与步骤]
只要将案例5-1中代码作相应修改即可实现,修改后的代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,"解一元二次方程")
If b * b - 4 * a * c >= 0 Then
x1 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a)
x2 = (-b + Math.Sqrt(b * b - 4 * a * c)) / (2 * a)
MsgBox("x1=" & x1 & Chr(13) & Chr(10) & "x2=" & x2)
Else
MsgBox("无实数解!")
End If
End Sub
[相关知识]
IF分支结构语句分单行结构与块结构两种形式。
1. 单行结构
If condition Then statement [Else elsestatement]
2. 块结构
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
单行结构适用于简单的测试,块结构不仅具有更强的结构性与适应性,而且也易于维护与调试。单行结构与块结构的区别有两点:
(1) 块结构的Then后面没有语句,而单行结构的肯定有语句;
(2) 单行结构没有End If结束语句,而块结构必须有该结束语句。
[技能目标]
掌握Select分支结构的程序流程与使用。
本案例是一个输入月份查询季节的程序。当输入月份为12、1和2时,输出"冬季";当输入月份为3、4和5时,输出"春季";当输入月份为6、7和8时,输出"夏季";当输入月份为9、10和11时,输出"秋季";当输入其它数字时,输出"输入错误,请重新输入!"。相关界面见图5-5。
(a) (b) (c)
图5-5 案例5-3界面
[操作要点与步骤]
1. 新建一个项目"Vbnet5-3"
2. 在窗体上建立一个命令按钮
3. 双击命令按钮,进入代码编写窗口
4. 输入以下代码
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
Dim nm As Integer
nm = InputBox("请输入月份:","季节查询")
Select Case nm
Case 1,2,12
MsgBox("冬季!",MsgBoxStyle.OKOnly,"查询结果:")
Case 3,4,5
Case 6,7,8
Case 9,10,11
Case Else
End Select
End Sub
[相关知识]
有时需要判定的条件较多,如果再用以上的条件结构,则代码显得十分繁琐且容易出错。为此VB.NET提供了专门用于多重判定的选择结构(也称为情况语句)。
Select Case 语句是VB.NET语言中的多分支语句,语句格式如下:
Select Case <测试表达式>
Case <表达式列表1>
<语句块1>
Case <表达式列表2>
<语句块2>
……
[Case Else
<语句块n+1>]
End Select
VB.NET在执行时首先计算测试表达式的值,然后将该值与每个Case后的值进行比较,若值相同就执行该Case后的语句块。如果有多个Case值与之相匹配,只执行第一个;如果没有一个匹配则执行Case Else后的语句块
使用Select选择结构语句的关键是选择合适的测试表达式,并确定合适的测试值。测试值的表示方法可以有以下几种:
· 具体取值,可以是一个或多个,如100,85,1
· 连续的数据范围,如上例85 To 100、60 To 84等。
· 利用Is关键字来判定,如对于成绩而言不可能大于100,因此85 To 100就可以写成 Is >=85
· 以上几种表示方法的组合,如100,60 To 84,Is >=85
5.2.3循环结构
在VB.NET中提供了多种形式的循环结构语句,循环结构是在指定的条件下多次重复执行一组语句。
【案例5-3】编写一个程序,计算1+2+……+(n-1)+n的值,其中n 通过input语句输入,结果通过msgBox语句输出。相关界面见图5-6。
(a) (b)
图5-6 案例5-4界面
[技能目标]
1. 掌握循环结构的程序流程。
2. for …… next循环语句的使用。
[操作要点与步骤]
1. 新建一个项目"Vbnet5-3"
2. 在窗体上建立一个命令按钮
3. 双击命令按钮,进入代码编写窗口
4. 输入以下代码
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
Dim i As Integer
Dim n As Integer
n = InputBox("输入N的值:","1+2+……+n")
Dim s As Integer
For i = 1 To n
s = s + i
Next
MsgBox("s=" & s)
End Sub
[相关知识]
For循环一般用于循环次数已知的情况。For循环含有一个循环计数变量,每执行一次循环,该变量就会增加或减少指定的值,直到循环结束。其语法格式如下:
For counter = start To end [Step step]
[statements]
[Exit For]
[statements]
Next [counter]
该语句执行时,先将counter设为start(初值)。测试counter的值是否超过end(如step为正数是大于,否则是小于),若已经超过,则循环结束,否则执行循环体中的语句。step是每次循环时counter变化的数值,它可正可负,缺省时为1。本次循环结束后,counter将加上步长step的值返回到循环开始,再进行测试,直到counter的值超过终值,循环结束。同样可以在循环体内加上判定结构与Exit For结合从而提前退出循环。
1、不要在循环体内修改循环计数变量的值,否则会造成循环次数的不准确,而且程序调试也非常困难。
2、初值、终值与步长均为数值表达式,但其值不一定是整数,也可以是实数,VB会自动取整。
1、Do While……Loop语句
使用Do While……Loop语句,实现上例功能的代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,"1+2+……+n")
Dim s As Integer
i=1
Do While i< = n
s = s + i
i = i + 1
Loop
MsgBox("s=" & s)
End Sub
2、Do Until……Loop语句
使用Do Until……Loop语句,实现上例功能的代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
Dim i As Integer = 1
Dim n As Integer
n = InputBox("输入N的值:","1+2+……+n")
Dim s As Integer
i = 1
Do Until i > n
s = s + i
i = i + 1
Loop
MsgBox("s=" & s)
End Sub
3、Do……Loop While语句
使用Do……Loop While语句,实现上例功能的代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,"1+2+……+n")
Dim s As Integer
Do
s = s + i
i = i + 1
Loop While i<=n
MsgBox("s=" & s)
End Sub
4、Do……Loop Until语句
使用Do……Loop Until语句,实现上例功能的代码如下:
Private Sub Button1_Click(ByVal sender As System.Object,"1+2+……+n")
Dim s As Integer
Do
s = s + i
i = i + 1
Loop Until i>n
MsgBox("s=" & s)
End Sub
Do循环主要用于循环次数预先不能确定的循环结构。它有两种语法形式,当型与直到型。
· 当型循环
Do [{While | Until} condition]
[statements]
[Exit Do]
[statements]
Loop
· 直到型循环
Do
[statements]
[Exit Do]
[statements]
Loop [{While | Until} condition]
当型循环是先判断,后执行,循环体中的语句可能一次也不执行。而直到型循环是先执行后判断,循环体中的语句至少执行一次。
5.3过程
所谓过程是指能完成某种特定功能、且能被反复调用的一组程序代码。VB.NET中的过程可以分为两大类,一类是VB.NET本身所提供的大量内部函数过程和事件过程;另一类是用户根据需要自己定义的、可供事件过程反复调用的自定义过程。事件过程构成了应用程序的主体,而自定义过程则是为事件过程服务,供事件过程调用的。
在VB.NET中自定义过程又可以分以下4种:
· Sub过程。以Sub为关键字的过程,也称为子过程。实际上通常的事件过程也是Sub过程。
· Function过程。以Function为关键字的过程又称为函数。
· Property过程。以Property为关键字的过程称为属性过程,主要用于用户自定义控件的属性。
· 事件过程。为响应由用户操作或程序中的事件触发的事件而执行的 Sub 过程。
对于VB.NET过程有以下几点说明:
(1) VB中的任何过程均必须包含在某一个模块之中。
(2) Sub过程在调用后不会返回值,而Function过程会返回一个值。
(3) 用户自定义过程根据其作用范围的不同可分为公有过程和私有过程两种。
(4) 事件过程的作用范围一般局限于该模块范围之内。
本书限于篇幅,只讨论前两种过程。
5.3.1 Sub过程
【案例5-4】编写一个已知三角形三边的长求三角形面积的过程,通过对过程的调用,计算三角形的面积。相关界面见图5-7。
(a) (b)
(c) (d)
图5-7 案例5-5界面
[技能目标]
1. 掌握Sub过程的定义。
[案例说明]
编写一个程序,建立一个Sub过程,通过过程调用计算三角形的面积。
[操作要点与步骤]
1. 新建一个项目"Vbnet5-4"
2. 单击"项目"菜单中的"添加模块"命令,添加模块,在Module1中输入如下代码:
Module Module1
Public Sub s(ByVal a As Single,ByVal b As Single,ByVal c As Single,ByRef ss As Single)
Dim cc As Single
cc = (a + b + c) / 2
ss = Math.Sqrt(cc * (cc - a) * (cc - b) * (cc - c))
End Sub
End Module
3. 在窗体上建立一个命令按钮
4. 双击命令按钮,进入代码编写窗口
5. 输入以下代码:
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
Dim aa As Single
Dim bb As Single
Dim cc As Single
Dim area As Single
aa = InputBox("请输入三角形第一条边的边长:","数据输入")
bb = InputBox("请输入三角形第二条边的边长:","数据输入")
cc = InputBox("请输入三角形第三条边的边长:","数据输入")
Call s(aa,bb,cc,area)
MsgBox("三角形面积为:" & Int(area),"计算结果")
End Sub
[相关知识]
设计一个比较复杂的程序,首先,按照程序中要实现的若干主要功能,往往将程序分解成一个个相对简单的问题去解决。每个简单问题通过一段程序实现,它们之间相对独立,这种程序称之过程,以"Sub"保留字开始的子程序过程,没有返回值。
1. 定义Sub过程
过程定义的一般格式如下:
[Private | Friend | Public | Protected | Protected Friend ] Sub 过程名(参数列表)
[局部变量和常量声明] '用Dim或Const声明
[语句块]
[Exit Sub]
[语句块]
End Sub
[功能] 建立一个由"过程名"标识的通过过程。
[说明]
(1) 缺省[Private | Public…]时,系统默认为Public;
(2) 以关键字Private开头的通过过程是模块级的(私有的)过程,私有过程只能被有、同一模块中的过程调用。以关键字Public开通的通过过程是公有的或全局的过程,公有过程可以被应用程序中的任一过程调用;
(3) 过程的命名规则与标识符命名规则相同,在同一个模块中,同一符号名不得既用作Sub过程名,又用作Function过程名;
(4)"参数列表"中的参数称为形式参数,简称形参。它可以是变量名或数组名,只能是简单变量,不能是常量、数组元素、表达式:若有多个参数时,各参数之间用逗号分隔,行参没有具体的值。VB.NET的过程可以没有参数,但一对圆括号不可以省略。不含参数的过程称为无参数过程。形参的一般格式如下:
[格式1]
[Optional] [ByVal] 变量名[()] As 数据类型
[格式2]
[Optional] [ByRef] 变量名[()] As 数据类型
[格式3]
ByVal | ByRef Paremrray 参数数组名()As 数据类型
[说明]
l ByVal:表明其后的形象是按值传递参数(传值参数 Passed By Value),或称为"传值"方式。若缺省表示ByRef。
l ByRef:表明参数是按地址传递的(传址参数)或成"传址"(Passed By Reference)方式。
l Optional:表明该参数是一个可选参数。
l 变量名[()]:明亮名为合法的VB.NET变量名或数组名,无括号表示变量,有括号表示数组。
(5) Sub 过程不能嵌套定义,但可以嵌套调用;
(6) End Sub 标志该过程的结束,系统返回并调用该过程语句的下一条语句;
(7) 过程中可以用End Sub 提前结束过程,并返回到下调用该过程语句的下一条语句。
2. 建立Sub过程的方法
通过过程可以在窗体中建立也可以在模块中建立。
在窗体中建立通过用过程的一般步骤如下:
(1) 打开代码编辑器窗口。
(2) 找到文字"Windows 窗体设计器生成的代码"所在位置。
(3) 直接在该段文字的下方输入要建立的通用过程。
通用过程还可以定义在模块文件中,模块文件是以.vb为扩展名的文件。模块代码以Module开头,以End Module结尾。可以将各窗口都公用的过程或函数一起放在模块中,这样可使程序更加清晰、易懂、便于维护。
在模块中建立通用过程的一般步骤如下:
(1) 选择"项目""添加模块"命令,出现"添加新项"对话框。
(2) 在"添加新项"对话框的"模板"内选择"模块",在"名称"文本框中输入模块文件名,单击"打开"按钮,在代码对话框中显示建立的该模块的模板。
(3) 在Module Module1下面输入要建立的通用过程代码。
(4) 选择"文件""保存 Module1.vb"命令,保存模块文件。
3. Sub 子过程的调用
[格式]
Call <通用过程名> ([实际参数列表])
或<通用过程名> ([实际参数列表])
实际参数的个数、类型和顺序,应该与被调用过程的形式参数相匹配,有多个参数时,用逗号分隔。如果通用过程无形参,"实际参数列表"可以缺省。
5.3.2 Function过程
【案例5-5】编写一个已知三角形三边的长求三角形面积的函数,通过对函数的调用,计算三角形的面积。相关界面见图5-8。
(a) (b)
(c) (d)
图5-8 案例5-6界面
[技能目标]
1. 掌握Function过程的定义。
[操作要点与步骤]
1. 新建一个项目"Vbnet5-5"
2. 单击"项目"菜单中的"添加模块"命令,添加模块,在Module1中输入如下代码:
Public Function s(ByVal a As Single,ByVal c As Single)
Dim cc As Single
cc = (a + b + c) / 2
Dim ss As Single
ss = Math.Sqrt(cc * (cc - a) * (cc - b) * (cc - c))
Return ss
End Function
3、在窗体上建立一个命令按钮
4、双击命令按钮,进入代码编写窗口
5、输入以下代码:
Private Sub Button1_Click(ByVal sender As System.Object,"数据输入")
area = s(aa,cc)
MsgBox("三角形面积为:" & Int(area),"计算结果")
End Sub
[相关知识]
在VB.NET中,包含了许多内部函数过程,如Trim(x),Asc(x),Mid(c,Start,n)等,在编写程序时只需写出函数过程名和相应的参数,就可以得到函数的返回值。另外,在应用程序中,用户还可以使用Function语句来定义自己的函数过程。
函数定义的一般式如下:
[Private | Friend | Public | Protected | Protceted Friend | Function 函数过程名
[(参数列表)] [As 数据类型]
[局部变量和常量声明] '用Dim或Const声明
[语句块]
[Exit Function]
[函数过程名=表达式] | [Return 表达式]
[语句块]
End Function
[说明]
(1) 函数过程名的命名规则与标识符命名规则相同;函数过程必须由函数名返回一个值。
(2) "As 数据类型"用来指定函数过程返回值的类型。缺省该选项时,返回值类型默认为Object类型。
(3) 在函数过程体内通过"函数过程名=表达式"给过程名赋值,所赋的值就是函数过程的返回值。也可以直接使用"Return"表达式语句来返回函数值,表达式的值就是函数过程的返回值。
(4) 如果函数体内没有给函数名赋值,则返回对应类型的缺省值,数值型返回0,字符型返回空字符串。
5.3.3参数传递
在调式过程时,一般主调过程与被调过程之间有数据传递,即将主调过程的实参传递给被调过程的形象,完成实参与形参的结合,然后执行被调过程体,这个过程称为参数传递。
注意:过程调用时实际参数的个数、类型和含义与形式参数的个数、类型和含义一致。
(1) 按值传递参数
定义形参时,形参前面加上"ByVal"表示该形参是按值传递的形参。传递过程为:首先,将实际参数(表达式)的数值进行计算并将结果存放到对应的形式参数存储单元;然后,实际参数与形式参数断开联系。被调用过程中的操作是在形式参数自己的存储单元中进行,当过程调用结束时,这些形式参数所占用的存储单元也同时被释放。因此在过程中形式参数的任何操作不会影响到实参。
按值传递参数是一种单向传递,即实参的值能够传给形象,但对形参的改变却无法影响到实参。
(2) 按址传递参数
定义形参时,形参前面加上"ByRef"表示该形参是按址传递的形参。按址传递参数是指实际参数的地址传给对应的形式参数。在被调过程中对形式参数的任何操作都变成了对应实参的操作,因此实际参数的值就会随形式参数的改变而改变。当参数是字符串、数值时,使用按址传递参数直接将实参的地址传递给过程,会使程序的效率提高。
5.4程序调试和异常处理
随着程序规模的越来越庞大和结构的越来越复杂,在程序编写中不可避免地会产生一些错误,这些错误称为缺陷。找出并排除这些错误的过程称为调试。本节中将介绍错误的类型,常用的调试工具和在应用研究程序中实现结构化的异常处理。
5.4.1错误类型
程序中的错误通常可以分成3类:语法错误、运行错误和逻辑错误。可以使用不同的方法和工具来查找并修改每种类型的错误。其中语法错误比较容易排除,也是一种低级的错误。运行错误和逻辑错误需要靠经验、调试工具以及不断深入地分析代码来排除。
1. 语法错误
语法错误通常发生在编程人员对语言本身的熟悉度不足,例如关键字拼错、标点错误(如西文标点写成了中文标点)或漏写、结构错误(如If之后忘了加上Then或者For语句少了Next)等等。
在应用程序代码中每输入一句语句,VB .NET都会显示其所包含的语法错误(若存在语法错误的话),包含错误的那部分代码下会标有波浪线。当把鼠标指针移到带波浪的代码上时,鼠标指针附近就会出现一条简短的错误描述提示,并且,运行后在任务列表窗体中会产生相关的错误信息。见图 5-9。
(a) (b)
图5-9 语法错误
2. 运行错误
运行是错误多数发生于不可预期的异常。比如打开硬盘上的某个文件时,该文件不存在:向硬盘上写某个文件的时候,硬盘的空间不足;由于网络阻塞得不到预期的数据等。也有可能是用户不按正确的操作步骤而造成的错误,比如在做除法的时候除数为零;访问数组的时候,超出了可访问下标的范围。
3. 逻辑错误
逻辑错误是指程序算法的错误,这种错误程序不会发生任何程序中断或跳出程序,而是一直执行到最后,但是执行结果是错误的。由于逻辑错误不会产生错误的信息,所以逻辑错误的发现和排除是比较困难的。
5.4.2调试工具
1. VB.NET的工作模式
VB.NET的工作模式有三种:设计模式、运行模式和中断模式。
VB.NET启动后,自动进入设计模式。在设计模式下,标题栏显示"设计"字样。在设计模式下,可以进行相关的设计操作。如窗体设计、添加控件、设置对象属性、编写代码等。
当程序设计完成后,执行启动命令,系统进入运行模式,在运行模式下,标题栏显示"运行"字样。在运行模式下设计人员不能修改程序代码,但可以查阅程序代码。
当程序处于运行模式时,在以下情况下将进入中断模式:执行"全部中断"命令、程序运行到断点处、程序执行到"STOP"语句。在中断模式下,标题栏显示"中断"字样。在中断模式下,设计人员可以查看和修改程序代码,同时,可以检查或修改数据。修改完成后,可单击"继续"按钮,从中断处继续程序的运行。
2、2. 调试工具栏
单击视图菜单中的工具栏中的"调试"命令,在工具栏中出现在"调试"工具栏。见图5-10。
图 5-10 "调试"工具栏
从左到右各按钮的功能分别为:
l 启动/继续:开始执行程序。在设计模式下显示"启动",在中断模式下显示"继续"。
l 全部中断:强迫进入中断模式。
l 停止:由运行模式进入设计模式。
l 重新启动:由中断模式进入运行模式。
l 逐语句:在中断模式下执行下一行语句,如果执行到过程,则进入过程内部,逐语句执行。
l 逐过程:在中断模式下执行下一行语句,如果执行到过程,过程中的语句一次执行完成。
l 跳出:在中断模式下执行下一行语句,如果执行到过程或函数,不逐语句执行,并跳回调用函数的代码处。
l 设置断点:打开"断点"窗口。
3. 调试窗口
当在调试程序时采用上述逐语句、逐过程的方法,还无法解决问题时,就必须运用并结合VB.NET中的各类调试窗口进行分析,在VB.NET中共有以下几个调试窗口:
(1) 自动窗口
只能在运行模式和中断模式下打开。用于显示当前代码处的相关变量的值。见图5-11。
图5-11 自动窗口
(2) 局部变量窗口
只能在运行模式和中断模式下打开。用于显示当前过程中所有局部变量的的值。见图5-12。
图5-12 局部变量窗口
(3) 调用堆栈窗口
只能在运行模式和中断模式下打开。用于跟踪多个过程调用的情况。见图5-13。
图5-13 调用堆栈窗口
(4) 监视窗口
只能在运行模式和中断模式下打开。用于显示指定的表达式的值。见图5-14。
图5-14 监视窗口
(5) 命令窗口
可以在命令窗口中,输入执行函数和语句,可以查看和更改有关变量的值。见图5-15。
图5-15 命令窗口
(6) 断点窗口
通过运行"调试"菜单中的"新断点"命令,可以设置断点的出现条件,在运行过程中,当满足相关条件时,程序中断。见图5-16。
(a) (b)
图5-16 断点窗口
5.4.3异常处理
Visual Basic .NET支持结构化和非结构化异常(错误)处理。通过在应用程序中设置特定代码,可以处理用户可能遇到的大多数错误并使应用程序能够继续运行。结构化和非结构化错误处理允许为潜在的错误进行计划,防止它们干扰应用程序的正常工作。
如果发生异常的方法不能处理它,异常将被传回调用方或前一个方法。如果前一个方法也没有异常处理程序,则异常被传回该方法的调用方,依次类推。对处理程序的搜索一直持续到"调用堆栈",它是应用程序内被调用过程的序列。如果未能找到异常的处理程序,则被显示错误信息并终止应用程序。
1、结构化异常处理
Visual Basic 支持结构化异常处理,该处理帮助创建和维护具有可靠、全面的错误处理程序的程序。结构化异常处理是旨在通过将控件结构(类似于 Select Case 或 While)与异常、受保护的代码块和筛选器结合起来,在执行期间检测和响应错误的代码
使用 Try...Catch...Finally 语句,可以保护有可能引发错误的代码块。可以嵌套异常处理程序,并且在每个块内生命的变量将具有局部范围。
[格式]
Try
[Try 语句块]
[Catch [exception [As type ]] [When expression ] '用于捕获Try语句块中的异常Ctach 语句块] 'Catch 语句块用来对捕捉的错误进行处理
......
[Finally
[Finally 语句块]] ' Finally 语句块,存放异常处理后执行的代码
End Try
2、结构化异常处理
非结构化异常处理由三个语句实现:Error语句、On Error语句和Resume语句。当方法使用非结构化异常处理时,将为整个方法建立单个的异常处理程序来捕获引发的所有异常。该方法然后跟踪最新的异常处理程序位置和已引发的最新异常。在方法的入口点,异常处理程序位置和异常均设置为Nothing。
5.5面向对象的程序设计简介
【案例5-6】类及对象的创建
以创建一个汽车类为例,介绍类和对象的创建等相关知识。该汽车类具体参数为:具有四个轮子、五个座椅,每行驶3000公里需要保养一次,行驶50000公里后,该车报废。见图5-17。
图5-17 案例5-7 界面
[技能目标]
1. 掌握类和对象的创建
3、了解控制台应用程序的创建方法
[操作要点与步骤]
1、单击"文件"菜单,在出现的下位菜单中,单击"新建",再单击"新建项目",新建一个项目。项目存放在"D:/VB.net"下,项目名取"mycar"。项目类型选择"Visual Basic项目"、模板选择"控制台应用程序",项目名与位置按以上要求改写,其他选默认值,单击"确定"按钮。见图5-18。
图5-18 创建控制台应用程序
2、创建类(Car),为类添加属性、方法、事件,创建汽车类的实例"mycar",在行驶了3000公里,触发"保养"事件;在行驶了50000公里后,触发"报废"事件。
具体代码如下:
Module Module1
Public WithEvents mycar As New Car
Sub Main()
Dim i As Integer
For i = 1 To 200
If mycar.runable = True Then
mycar.go()
mycar.runcount += 1000
Else
Console.WriteLine("汽车已无法行驶!")
Exit For
End If
Next
Console.ReadLine() 'wait for press anykey
End Sub
Sub takecareeventhandler() Handles mycar.takecare
Console.WriteLine("已行驶3000公里,需要保养一次!")
End Sub
Sub expireeventhandler() Handles mycar.expire
Console.WriteLine("已行驶50000公里!")
mycar.runable() = False
End Sub
Public Class Car
'成员变量
Private _Color As String = "红色"
Public _wheelcount As Short = 4
Public _chaircount As Short = 5
Public _runcount As Integer = 0
Public _runable As Boolean = True
'声明事件
Public Event takecare() '保养
Public Event expire() '报废
'属性:颜色
Public Property Color() As String
Get
Return _Color '返回属性值
End Get
Set(ByVal Value As String)
_Color = Value
End Set
End Property
'轮子的数目
Public ReadOnly Property wheelcount() As Short
Get
Return _wheelcount
End Get
End Property
'椅子的数目
Public Property chaircount() As Short
Get
Return _chaircount
End Get
Set(ByVal Value As Short)
_chaircount = Value
End Set
End Property
'行驶公路数
Public Property runcount() As Integer
Get
Return _runcount
End Get
Set(ByVal Value As Integer)
_runcount = Value
Console.WriteLine("已行驶公里:" & _runcount.ToString())
If _runcount Mod 3000 = 0 Then
'每3000公里保养一次!
RaiseEvent takecare()
End If
If _runcount > 50000 Then
'50000公里汽车报废!
RaiseEvent expire()
End If
End Set
End Property
'可行驶状态
Public Property runable() As Boolean
Get
Return _runable
End Get
Set(ByVal Value As Boolean)
_runable = Value
End Set
End Property
'方法:汽车开动
Public Sub go()
Console.WriteLine("嘀……")
End Sub
Sub New()
_Color = "米色"
End Sub
End Class
End Module
[相关知识]
创建类的关键字是:Class,完整的类包含了组成类的属性、方法、事件、类的变量和构造函数等。创建类的代码如下:
Public Class Car
End Class
在VB.net中,使用Sub和Function过程来创建方法。
'方法:汽车开动
Public Sub go()
Console.WriteLine("嘀……")
End Sub
在VB.NET中,使用Property语句来定义类的属性。
'属性:颜色
Public Property Color() As String
Get
Return _Color '返回属性值
End Get
Set(ByVal Value As String)
_Color = Value
End Set
End Property
Public ReadOnly Property wheelcount() As Short
Get
Return _wheelcount
End Get
End Property
事件是一种对外界操作产生响应的机制。在程序中通过事件的声明和驱动机制,可以使对象具有与应用程序交互的能力。
类的事件创建
本例中创建了二个事件:
(1)行驶3000公里,需要保养一次
(2)行驶50000公里,汽车报废
Sub takecareeventhandler() Handles mycar.takecare
Console.WriteLine("已行驶3000公里,需要保养一次!")
End Sub
Sub expireeventhandler() Handles mycar.expire
Console.WriteLine("已行驶50000公里!")
mycar.runable() = False
End Sub
2、事件的驱动
RaiseEvent takecare()
RaiseEvent expire()
1、对象的创建
类的对象又称为类的实例。创建类的对象的语句如下:
Public mycar As New Car
2、对象的使用
Mycar.runable=True '为对象设置属性
Mycar.go() '对象的方法
Cc=mycar.runcount '读取对象的属性
成员变量是指在类中声明,运行应用程序时适用于每一个单独对象的变量。
Private _Color As String = "红色"
Public _wheelcount As Short = 4
Public _chaircount As Short = 5
Public _runcount As Integer = 0
Public _runable As Boolean = True
构造函数是在创建对象时调用的一个特定的方法。构造函数主要用于为对象分配存储空间,完成初始化操作。构造函数是一个通用过程,过程名为New。当类中设有定义构造函数时,系统采用默认构造函数。
Public sub new
End sub
本例的构造函数如下:
Sub New()
_Color = "米色"
End Sub
【案例5-7】类和类的继承。
先创建一个Animal类,Cat类使用类的继承的方法创建。见图5-19。
图5-19 案例5-8 运行结果
[技能目标]
1. 巩固掌握类和对象的创建
2. 掌握类的继承
[操作要点与步骤]
1、单击"文件"菜单,在出现的下位菜单中,单击"新建",再单击"新建项目",新建一个项目。项目存放在"D:/VB.net"下,项目名取"animal。项目类型选择"Visual Basic项目"、模板选择"控制台应用程序",项目名与位置按以上要求改写,其他选默认值,单击"确定"按钮。
2、创建一个Animal类,并创建一个实例a_animal。见图5-20。
图5-20 运行结果
代码如下:
Module Module1
Public Class animal
Dim legs As Short
Public Sub speak()
Console.WriteLine("我是一种动物!")
End Sub
End Class
Sub Main()
Dim a_animal As New animal()
a_animal.speak()
Console.ReadLine()
End Sub
End Module
3、通过类的继承,创建Cat类
图5-21创建Cat类
Module Module1
Public Class animal
Dim legs As Short
Public Sub speak()
Console.WriteLine("我是一种动物!")
End Sub
End Class
Public Class cat
Inherits animal
End Class
Sub Main()
Dim a_animal As New animal()
a_animal.speak()
Dim a_cat As New cat()
a_cat.speak()
Console.ReadLine()
End Sub
End Module
VB.NET中最重要的新特性就是继承(Inheritance)。继承就是从一个简单的类(Basic class)派生出一个新类(称为派生类或继承类)的能力。派生类继承了基类的所有的属性、方法、事件域等。
Public Class cat
Inherits animal
End Class
1、Cat类中的"speak"方法的重载。见图5-22。
图5-22 方法的重载
Module Module1
Public Class animal
Dim legs As Short
Public Overridable Sub speak()
Console.WriteLine("我是一种动物!")
End Sub
End Class
Public Class cat
Inherits animal
Public Overloads Sub speak()
Console.WriteLine("喵喵……")
End Sub
End Class
Sub Main()
Dim a_animal As New animal()
a_animal.speak()
Dim a_cat As New cat()
a_cat.speak()
Console.ReadLine()
End Sub
End Module
派生类(又称继承类)从基类中继承了属性和方法,为了使派生类具有新的属性和方法,就要用到重载。要能在派生类中实现方法的重载,必须在基类的该方法的声明时用Overrideable修饰符。
Public Overridable Sub speak()
在重载方法时用Overloads修饰符。
Public Overloads Sub speak()
Console.WriteLine("喵喵……")
End Sub
【案例5-9】将类组织到命名空间。
将class1类和class2类组织到命名空间namespace1。见图5-23。
[技能目标]
1. 掌握命名空间的概念
2. 掌握类的继承
[操作要点与步骤]
1、单击"文件"菜单,在出现的下位菜单中,单击"新建",再单击"新建项目",新建一个项目。项目存放在"D:/VB.net"下,项目名取"namespacelx"。项目类型选择"Visual Basic项目"、模板选择"Windows应用程序",项目名与位置按以上要求改写,其他选默认值,单击"确定"按钮。
2、单击"项目"菜单中的"添加类"命令,在出现的对话框中的"模板"中选择"代码文件",单击"打开"按钮。在出现的对话框中输入如下代码。
Namespace namespace1
Class class11
Public Sub class1method()
MsgBox("class1's method")
End Sub
End Class
Class class12
Public Sub class2method()
MsgBox("class2's method")
End Sub
End Class
End Namespace
3、在form1窗体中建立二个命令按钮Button1t和Button2,在相应的"Click"事件中输入以下代码。
Imports namespacelx.namespace1
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button1.Click
Dim myclass1 As New class11()
myclass1.class1method()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button2.Click
Dim myclass2 As New class12()
myclass2.class2method()
End Sub
End Class
4、运行后,单击二个命令按钮,效果如图5-23。
(a) (b) (c)
图5-23 命名空间实例
命名空间(namespace)是将逻辑上相关的程序组件组织成具有组织层次的系统的一种方法,面这些组件仍可以在其它项目和应用程序中,一个命名空间可以包含其它的命名空间。
练习园地5
一、基础题
1、试述VB.NET的书写规则?
4、类和对象有什么区别和联系?
5、命名空间的作用是什么?
二、实战题
1、写出满足如下条件的VB.NET的表达式
(1)产生一个100以内的随机整数
(2)产生一个随机的小写字母
(3)一元二次方程的求根公式
(4)已知三角形三边之长,求三角形面积。
2、运用inputBox语句和msgBox语句,编写一个输入月份,输出相关季节的程序。
三、挑战题
1、编写一个能将10进制数转换成二进制数的程序?
2、定义一个动物类,通过类的继承,派生出一个新的鸟类,再由鸟类通过类的继承,派生出一个鸽子。