常数
经常会发现代码包含一些常数值,它们一次又一次地反复出现。还可发现,代码要用到很难记住的数字,而那些数字没有明确意义。
在这些情况下,可用常数大幅度地改进代码的可读性和可维护性。常数是有意义的名字,取代永远不变的数值或字符串。尽管常数有点像变量,但不能像对变量那样修改常数,也不能对常数赋以新值。常数有两种来源:
1.内部的或系统定义的常数是应用程序和控件提供的。在“对象浏览器”中的VisualBasic(VB)、和VisualBasicforapplications(VBA)对象库中列举了VisualBasic的常数。其它提供对象库的应用程序,如MicrosoftExcel和MicrosoftProject,也提供了常数列表,这些常数可与应用程序的对象、方法和属性一起使用。在每个ActiveX控件的对象库中也定义了常数。关于使用“对象浏览器”的详细信息,请参阅第九章“用对象编程”。
2.符号的或用户定义的常数是用Const语句来声明的。下节“创建属于自己的常数”中将说明用户定义的常数。
在VisualBasic中,常数名采用大小写混合的格式,其前缀表示定义常数的对象库名。来自VisualBasic和VisualBasicforapplications对象库的常数以"vb"开头,例如vbTileHorizontal。
设计前缀时应尽力防止发生意外冲突,不能出现常数名称相同但表示不同数值的情况。即使使用了前缀,两个对象库也仍可能包含表示不同值的相同常数。在这种情况下,引用哪个常数取决于哪个对象库具有更高的优先级。关于改变对象库优先级的信息,请参阅“引用对话框”部分。
为了绝对确保不发生常数名字冲突,可用以下语法来限定对常数的引用:
[libname.][modulename.]constname
Libname通常是控件或库的类名。Modulename是定义常数的模块的名字。Constname是常数名。在对象库中定义了每个元素,并能在“对象浏览器”中查看元素。
创建属于自己的常数
声明常数的语法是:
[Public|Private]Constconstantname[Astype]=expression
参数constantname是有效的符号名(其规则与建立变量名的规则一样),expression由数值常数或字符串常数以及运算符组成;但在expression中不能使用函数调用。
Const语句可以表示数量、日期和时间:
ConstconPi=3.14159265358979
PublicConstconMaxPlanetsAsInteger=9
ConstconReleaseDate=#1/1/95#
也可用Const语句定义字符串常数:
PublicConstconVersion="07.10.A"
ConstconCodeName="Enigma"
如果用逗号进行分隔,则在一行中可放置多个常数声明:
PublicConstconPi=3.14,conMaxPlanets=9,_
conWorldPop=6E 09
等号(=)右边的表达式往往是数字或文字串,但也可以是其结果为数或字符串的表达式(尽管表达式不能包含函数调用)。甚至可用先前定义过的常数定义新常数。
ConstconPi2=conPi*2一旦已定义常数,就可将其放置在代码中,使代码更可读。例如:
StaticSolarSystem(1ToconMaxPlanets)
IfnumPeople>conWorldPopThenExitSub
设定用户自定义常数的范围
和变量声明一样,Const语句也有范围,也使用相同的规则:
为创建仅存在于过程中的常数,请在这个过程内部声明常数。
为创建一常数,它对模块中所有过程都有效,但对模块之外任何代码都无效,请在模块的声明段中声明常数。
为创建在整个应用程序中有效的常数,请在标准模块的声明段中进行声明,并在Const前面放置Public关键字。在窗体模块或类模块中不能声明Public常数。
详细信息关于范围的更详细信息,请参阅本章前面的“理解变量的范围”一节.
避免循环引用
由于常数可以用其它常数定义,因此必须小心,在两个以上常数之间不要出现循环或循环引用。当程序中有两个以上的公用常数,而且每个公用常数都用另一个去定义时就会出现循环。例如:
在Module1中:
PublicConstconA=conB*2 在整个应用程序
中有效。
在Module2:
PublicConstconB=conA/2 在整个应用程序
中有效。
如果出现循环,在试图运行此应用程序时,VisualBasic就会产生错误信息。不解决循环引用就不能运行程序。为避免出现循环,可将公共常数限制在单一模块内,或最多只存在于少数几个模块内。
数据类型
变量是用来存储值的所在处,它有名字和数据类型。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。所有变量都具有数据类型,以决定能够存储哪种数据。
根据缺省规定,如果在声明中没有说明数据类型,则令变量的数据类型为Variant。Variant数据类型很像一条变色龙,它可在不同场合代表不同数据类型。当指定变量为Variant变量时,不必在数据类型之间进行转换,VisualBasic会自动完成各种必要的转换。
但是,如果知道变量确实总是存储特定类型的数据,并且还声明了这种特定类型的变量,则VisualBasic会以更高的效率处理这个数据。例如,存储人名的变量最好表示成String数据类型,因为名字总是由字符组成。
除变量外,数据类型也用于其它场合。在给属性赋值时,这个值就有数据类型;函数的参数也有数据类型。事实上,在VisualBasic中,凡是与数据有关的东西就与数据类型有关。
你也可声明任何基本类型的数组。
详细信息关于更详细信息,请参阅本章后面的“数组”部分。在第十五章“性能和兼容性的设计”中还将讨论通过选择数据类型来提高应用程序的性能。
声明带数据类型的变量
在使用非Variant变量之前,必须使用Private、Public、Dim或Static语句将变量声明为Astype。例如,下列语句分别声明了Integer、Double、String和Currency类型的变量:
PrivateIAsInteger
DimAmtAsDouble
StaticYourNameAsString
PublicBillsPaidAsCurrency
一个声明语句可将多个声明组合起来,请看下列语句:
PrivateIAsInteger,AmtAsDouble
PrivateYourNameAsString,BillsPaidAsCurrency
PrivateTest,Amount,JAsInteger
注意如果不提供数据类型,则指定变量为缺省类型。在上例中,变量Test和Amount是Variant数据类型。如果由于其它编程语言的经验使你感到同一个声明语句中的所有变量都有相同的指定数据类型(此例中为Integer),那么,此处的结果可能会令人感到新鲜。
Numeric数据类型
VisualBasic支持几种Numeric数据类型:Integer(整型)、Long(长整型)、Single(单精度浮点型)、Double(双精度浮点型)和Currency(货币型)。与Variant类型相比,Numeric类型占用的存储空间通常要少。
如果知道变量总是存放整数(如12)而不是带小数点的数字(如3.57),就应当将它声明为Integer类型或Long类型。整数的运算速度较快,而且比其它数据类型占据的内存要少。在For…Next循环内作为计数器变量使用时,整数类型尤为有用。
详细信息关于控制结构的详细资料,请参阅本章后面的“控制结构概述”。如果变量包含小数,则可将它们声明为Single、Double或Currency变量。Currency数据类型支持小数点右面4位和小数点左面15位;它是一个精确的定点数据类型,适用于货币计算。浮点(Single和Double)数比Currency的有效范围大得多,但有可能产生小的进位误差。
注意浮点数值可表示为mmmEeee或mmmDeee,其中mmm是尾数,而eee是指数(以10为底的幂)。Single数据类型的最大正数值为3.402823E 38,或3.4乘以10的38次方;Double数据类型的最大正数值是1.79769313486232D 308或1.8乘以10的308次方。用D将数值文字中的尾数部分和指数部分隔开,就会导致将该值作为Double数据类型来处理。同样,用这种方式使用E,也会导致将该值作为Single数据类型来处理。
Byte数据类型
如果变量包含二进制数,则将它声明为Byte数据类型的数组(本章后面的“数组”中将讨论数组)。在转换格式期间用Byte变量存储二进制数据就可保留数据。当String变量在ANSI和Unicode格式间进行转换时,变量中的任何二进制数据都会遭到破坏。在下列任何一种情况下,VisualBasic都会自动在ANSI和Unicode之间进行转换:
读文件时
写文件时
调用DLL时
调用对象的方法和属性时
除一元减法外,所有可对整数进行操作的运算符均可操作Byte数据类型。因为Byte是从0-255的无符号类型,所以不能表示负数。因此,在进行一元减法运算时,VisualBasic首先将Byte转换为符号整数。
所有数值变量都可相互赋值,也可对Variant类型变量赋值。在将浮点数赋予整数之前,VisualBasic要将浮点数的小数部分四舍五入,而不是将小数部分去掉。
详细信息关于Unicode和ANSI转换的详细信息,请参阅第十六章“国际化”。
String数据类型
如果变量总是包含字符串而从不包含数值,就可将其声明为String类型。
PrivateSAsString
然后可将字符串赋予这个变量,并用字符串函数对它进行操作。
S="Database"
S=Left(S,4)
按照缺省规定,String变量或参数是一个可变长度的字符串。随着对字符串赋予新数据,它的长度可增可减。也可以声明字符串具有固定长度。可用以下语法声明一个定长字符串:
String*size
例如,为了声明一个长度为50字符的字符串,可用下列语句:
DimEmpNameAsString*50
如果赋予字符串的字符少于50个,则用空格将EmpName的不足部分填满。如果赋予字符串的长度太长,已不能成为定长字符串,则VisualBasic会直接截去超出部分的字符。
因为定长字符串用空格填充尾部多余的空间,所以在处理定长字符串时可发现,删除空格的Trim和RTrim函数是很有用的。 可将标准模块中的定长字符串声明为Public或Private。在窗体和类模块中,必须将定长字符串声明为Private。
详细信息请参阅《VisualBasic6.0语言参考手册》中的“Ltrim、RTrim和Trim函数”。
交换字符串和数字
如果字符串表示数值,则可将字符串赋予数值变量。也可将数值赋予字符串变量。例如,将命令按钮、文本框和列表框放置在窗体中。在命令按钮的Click事件中输入下列代码。运行应用程序并单击命令按钮。
PrivateSubCommand1_Click()
DimintXAsInteger
DimstrYAsString
strY="100.23"
intX=strY 将字符串传递给数值变量。
List1.AddItemCos(strY) 将字符串中数值的余弦值。
添加到列表框中。
strY=Cos(strY) 将余弦值传递给字符串变量。
Text1.Text=strY 在文本框中显示字符串。
EndSub
VisualBasic会自动强制变量为适当的数据类型。在转换字符串和数值时要小心;如果传送字符串中的值不是数值,则在运行时会出错。
Boolean数据类型
若变量的值只是“true/false”、“yes/no”、“on/off”信息,则可将它声明为Boolean类型。Boolean的缺省值为False。在下面的例子中,blnRunning是Boolean变量,存储简单的yes/no设置。
DimblnRunningAsBoolean
查看磁带是否在转。
IfRecorder.Direction=1Then
blnRunning=True
Endif
Date数据类型
Date和Time值既可包含在特定的Date数据类型中,又可包含在Variant变量中。一般的Date特性适用于这两种类型。
详细信息请参阅《联机手册》的“高级变量主题”中的“在Variant变量中存储Date/Time值”部分。
当其它数值数据类型转换为Date时,小数点左边的值表示Date信息,小数点右边的值则代表Time。午夜为0,正午为0.5。负数表示公元1899年12月31日之前的Date。
->