2.1 数据类型
2.2 数据类型转换
2.3 常数和枚举型( Enum)
2.4 结 构
2.5 变 量
2.6 运算符与表达式
2.7 数组与集合第 2章 Visual Basic.NET语言基础本章知识点:
变量及声明
运算符与表达式
数组及声明
常用内部函数第 2章 Visual Basic.NET语言基础为了方便识别和处理,编程语言系统中的不同信息在计算机中具有不同的表示,占用不同的储存空间,这些信息在语言系统中称之为 数据类型 。 Visual Basic,NET 使用的每种数据类型都与公共语言运行环境( CLR)的通用类型系统( Common
Type System,CTS)中的一种类型直接对应。这为构建跨语言集成,保证代码类型安全,确保用不同语言编写的对象能够交互作用打下了基础。
CTS支持两种类型:值类型和引用类型。
值类型直接包含数据。包括:所有的数值数据类型,Char、
Boolean,Date、所有结构、枚举类型。
引用类型数据包含指向对象实例的引用或指针。两个引用类型数据可以指向同一个对象实例,因此对一个引用类型数据的操作会影响其他引用类型数据。
引用类型包括,String、所有数组和类。
2.1 数据类型如表 2-1所示给出了 VB.NET常用的数据类型及其支持的 CLR类型和取值范围。
在,科学计数法,中,,E”表示以 10为底的幂。因此 3.56E+2
表示 3.56 × 102或 356,3.56E-2表示 3.56/102或 0.0356。
公共语言运行库根据应用程序所在执行平台的特性来分配存储。在某些情况下,它会尽可能紧密地压缩声明的元素(变量)。而在其他情况下它会将数据按内存地址的整数边界存放。
另外,在 64位平台上的存储分配与在 32位平台上不同。
引用任何基本或复合数据类型的 Object在除了该数据类型中包含的数据之外还要额外使用 4 Byte的引用地址。
2.1 数据类型
2.1.1 VB.NET的基本数据类型有符号的整型数据类型包括,SByte( 8位)、短整型 Short
( 16 位)、整型 Integer( 32 位)和长整型 Long( 64 位)。
如果某个变量总是存储整数而不是带小数的数字,则将它声明为这些类型中的一种。
用整型数进行算术运算比用其他数据类型快。在 VB.NET中使用 Integer类型进行算术运算是最快的。
对于 Byte,UInteger等无符号整型数据类型,无法表示负数。
如果将一元负( -)运算符用于取值为无符号整型数据类型的表达式,则 Visual Basic首先将表达式转换为相应的有符号的整型数据类型。
可用文本类型字符标识数据的类型,对于整型、文本类型字符 S表示 Short,I表示 Integer,L表示 Long,US表示 UShort,
UI表示 UInteger,UL表示 ULong。如:
Dim IntVar As ShortIntVar = 92S 。
2.1 数据类型
2.1.2 整型数据类型
2.1.3 非整型数据类型非整型数据类型有:十进制定点型 Decimal( 128位)、单精度浮点型 Single( 32 位)和双精度浮点型 Double( 64
位)。它们都是有符号类型。如果数据可能包含小数,则将其声明为这些类型之一。
相对于浮点型( Single 和 Double) Decimal 数据类型能表示的有效位数多、精度高,但数字的范围小。
浮点数的科学表示法为,mmmEeee,其中 mmm是尾数
(有效数字),eee是以 10为底的指数。
对于非整型,文本类型字符 D表示 Decimal,F表示 Single,
R表示 Double。如:
Dim DecVar As Decimal ‘字符 DecVar
被声明为 Decimal数据类型
DecVar = 9223372036854775808D ‘赋值时在数值后面加文本类型字符 D
2.1.4 字符数据类型字符数据类型是用来处理可打印和可显示的字符。有 Char
数据类型和 String数据类型两种。
Char数据类型是无符号的单个双字节( 16位) Unicode字符。 Char类型和数字类型之间的转换可以通过函数实现类型转换,如 AscW和 ChrW。
如果打开类型检查开关( Option Strict),必须将文本类型字符 C追加到单字符后,以将其标识为 Char数据类型,否则将出错。如下例所示:
Option Strict On ',..Dim CharVar As CharCharVar =
"¥ " ' Option Strict On时不允许从 String到 Char的隐式转换,故本句出错 CharVar = "¥ "C ' 必须加文本类型字符 C
String字符串类型是 0个或多个 Unicode字符的序列。如果某个变量总是包含字符串而从不包含数值,则将它声明为 String
类型,如:
Dim StrVar,StrVar1 As StringStrVar = "Database"StrVar1
= Microsoft.VisualBasic.Left(StrVar,4) ' StrVar1的值为
"Data" String 数据类型包含 Unicode 字符,而每个 Unicode 字符都可在 0 和 65,535 之间取值。 String 没有文本类型字符。
在任何标识符后追加标识符类型字符 $ 可将其强制转换成
String 数据类型。
另外,VBFixedStringAttribute类指示将字符串当作固定长度的字符串来处理。如:
<VBFixedString(m)> Public StrVar As String
其中,字符串变量 StrVar长度固定为 m个字符。
2.1.5 布尔型 ( Boolean)
Boolean数据类型是被解释为 True或 False的无符号值。如果某个变量只能包含两个状态,则将它声明为 Boolean类型。
Boolean没有文本类型字符,它的默认值是 False。
Boolean变量以 16位( 2 Byte)的数值形式存储,但只能是
True或是 False。使用关键字 True与 False将 Boolean变量赋值为这两个状态中的一个。如:
Dim BoVar As Boolean
BoVar = True
在将数值数据类型转换为 Boolean值时,0会转换为 False,
而其他所有值都将转换为 True。在将 Boolean值转换为数值类型时,False将转换为 0,True将转换为 -1。
建议不要编写依赖 True和 False的等价数值的代码,以免出现不必要的错误。
2.1.6 日期类型 ( Date)
Date数据类型是以 IEEE64位( 8Byte)整数的形式存储。
可表示从公历第 1年 1月 1号 (1:00:00 AM) 开始的时间。
Date数据类型的变量或常数可包含日期和时间。日期数据必须用,#”括起来,格式为 M/d/yyyy。如:
Dim SomeDate As Date
SomeDate = #1/1/1 01:00:00 AM# ‘等效
#01:00:00 AM#
SomeDate = #1/1/1 00:59:59 AM# ‘系统提示错误将数字数据类型转换为 Date类型时,Visual Basic将它的值视为有符号整数。如果试图转换负数,则会出错。
Date没有文本类型字符。等价的,NET数据类型是
System.DateTime。
2.1.7 对象类型( Object)
Object数据占用 4个字节的存储空间,作为应用程序中对象的引用地址。
即对象变量中存储的值被保存在内存中的其他地方,而变量本身保存一个指向该数据的指针。这样,可以为 Object变量分配任何引用类型(字符串、
数组、类或接口)和任意类型的数据。例如:
Dim ObjVar As Object
ObjVar = 123
ObjVar =,ABC123”
要决定 Object变量当前引用的数据类型,可以使用 Type类的
GetTypeCode方法。如上例中后面添加:
Dim DatTyp As Integer
DatTyp = Type.GetTypeCode(objVar.GetType())
就可知道 objVar最后引用的是字符串,因为其数据类型码 DatTyp=18。
声明对象变量时,尽量使用特定的类而不是一般的 Object。如使用 Button而不是 Control,这样就可以访问其属性和方法。通常可以使用“对象浏览器”
中的“类”列表来查找可用的类名。
2.1.8 值类型和引用类型如果某个数据类型在自己的内存分配中包含数据,则该数据类型是“值类型”。“引用类型”含有指向包含数据的所在内存位臵的指针。
值类型包括:
所有数字数据类型。
Boolean,Char 和 Date。
所有结构,即使其成员是引用类型。
枚举,因为其基础类型总是 Byte,Short,Integer或 Long。
引用类型包括:
String。
所有数组,即使其元素是值类型。
类类型,如 Form。
委托。
通过将某个 Object变量传递到 Microsoft.VisualBasic命名空间中
Information类的 IsReference方法,可以查看该变量充当的是引用类型还是值类型。如果 Object变量的内容表示引用类型,则
Microsoft.VisualBasic.Information.IsReference返回 True。
2.1.9 标识符类型字符
Visual Basic提供“标识符类型字符”集,可以在声明中使用这些字符来指定变量或常数的数据类型。可用的标识符类型字符及其用法如表 2-2所示。
Boolean,Byte,Char,Date,Object或 Short数据类型或者任何复合数据类型都没有标识符类型字符。
标识符类型字符也可以强制其他标识符的数据类型,甚至可以在表达式中使用它们。在所有情况下,标识符类型字符都必须紧跟在标识符之后,不加空格。
2.1.10 文本类型字符文本是类型的特定值的文本表示形式。代码中出现的文本形式通常确定其数据类型。编译器将整型文本视为 Integer,除非它们大得足够成为 Long;将非整型文本视为 Double。在下列语句中,
文本的数据类型是确定的:
J = 347 ' This literal is of the Integer data type.
X = 9.2 ' This literal is of the Double data type.
B = False ' This literal is of the Boolean data type.Visual Basic
提供了“文本类型字符”集,可以使用它们强制文本采用其形式所表示的数据类型。可以通过将字符追加到文本末尾来做到这一点。如表 2-3所示显示了可用的文本类型字符及其用法示例。
Boolean,Byte,Date,Object,String数据类型和任何复合数据类型都没有文本类型字符。
与变量、常数和表达式一样,文本也可以使用标识符类型字符
( %,&,@,!,#,$)。但是,文本类型字符( S,I,L,US、
UI,UL,D,F,R,C)只能用于文本。
在所有情况下,文本类型字符都必须紧跟在文本之后。
2.2 数据类型转换
2.2.1 扩大转换将一种数据类型改变为另一种数据类型的过程称为数据类型转换。如表 2-
4描述了可以执行的且不会丢失信息的扩大转换。
一些目标为 Single或 Double的扩大转换可能会导致丢失精度。如:
Int32,UInt32 扩大转换为 Single ;
Int64,UInt64,Decimal 扩大转换为 Single或 Double。
2.2.2 收缩转换标准的收缩转换包括:
如表 2-4中扩大转换的反向转换。
Boolean和任何数字类型之间的转换。
任何数字类型到任何枚举类型。
Char()数组和 String之间的转换。
String和任何数字类型( Boolean或 Date)之间的转换。
从数据类型或对象类型到其派生类型的转换。
收缩转换并不总是成功,它们可能会在运行时失败。如果目标数据类型无法接收正在转换的值,将会出错。例如,Integer
型数据到 Short型的转换就可能导致溢出。
2.2.3 隐式转换和显式转换隐式转换在源代码中不需要任何特殊语法。在下例中,
VB.NET将 IntVar的整型值隐式转换为 SngVar的单精度浮点数。
Dim IntVar As Integer,SngVar As SingleIntVar = 123
SngVar = IntVar 执行显式转换即所谓的将表达式的类型强制转换为给定的数据类型或对象类。
显式转换使用类型转换关键字。 VB.NET提供多个类似的关键字,如表 2-5所示。通过这些关键字强制将括号中的表达式转换为目标数据类型。这些关键字的行为类似函数,但编译器生成内联代码,所以执行速度比使用函数要稍快一些。
例如:
IntVar = 123 K = CShort (IntVar)?表达式 CShort
(IntVar)为 Short数据类型
K = Ctype(IntVar,Short)?表达式 Ctype(IntVar,Short)为
Short数据类型注意:与转换关键字一起使用的值对于目标数据类型必须是有效的,否则将出错。例如,如果试图将 Long转换为 Integer,
则 Long的值必须在 Integer数据类型的有效范围内。
.NET 2005中还可用 Convert 类中的若干转换方法进行显式转换,如:
Dim xDouble As Double = 15.0Console.WriteLine("Double,
{0}",Convert.ToInt64(xDouble))
2.3 常数和枚举型( Enum)
1,直接常量根据使用的数据类型,直接常量分为:字符串常量、数值常量、布尔常量、日期常量。
字符串常量:用英数半型双引号括起来的一串字符。如:
,12345”和“”是字符串常数。其中,,12345”的字符串长度是 5,而“”的字符串长度是 0。
数值常量:包括整型、长整型、货币型、浮点型和字节型。
布尔常量:只有 True(真)和 False(假)两个值。
日期常量:用两个,﹟,符号把表示日期和时间的值括起来,
形成日期常量。例如:
#05/16/2005# 或 #2005-05-1618:52:38#。
2,符号常量代码经常包含反复出现的常数值。它也可能依赖于某些难于记忆或没有明显意义的数值。在这些情况下,可通过使用常数来提高代码的可读性,并使代码更易维护。符号常量是有意义的名字,用以取代在程序运行中不变的数值或字符串。分为系统常量和用户定义常量两种。
系统常量:在用户程序中可不加说明直接引用。 VB.NET中有很多内部符号常量,如回车换行符 CrLf
( Microsoft.VisualBasic.ControlChars)等。 VB.NET系统内部定义的常量可在“对象浏览器”中查看。
用户定义符号常量符号常量有点像变量,但不能像对变量那样修改符号常量的值。用户定义符号常量的 Const语句的一般格式为:
[ Public| Private| Friend] Const﹤ 常量名 ﹥ [ As
﹤ 数据类型 ﹥ ]= ﹤ 表达式 ﹥
Const是定义符号常量的语句定义符;
﹤ 表达式 ﹥ 由数值、字符串等常量和运算符组成,可以包含前面定义过的符号常量,但不能使用函数调用。由于常量可以用其他常量定义,因此,在两个以上常量之间不要出现循环或循环引用。
用逗号进行分隔,则一行中可以放臵多个常量声明。
常量名后面可以使用类型说明符说明符号常量的类型。
例如,Const PI As Single = 3.1415926,TempData% = 20
2.3.2 枚举枚举提供了处理相关联的常数集的方便途径。枚举是一组值的符号名。
在类或模块的声明部分用 Enum语句创建枚举。不能在方法中声明枚举。使用 Private,Protected,Friend或 Public来指定适当的代码访问级别。
定义枚举类型可以将一组标识符与一组常数联系起来,在程序中,使用标识符代替常数可以增强程序的可读性。定义枚举类型的一般格式为:
[ public| private] Enum <定义枚举类型标识符 >
成员名 [= 常数表达式 ]
……
End Enum
常数表达式部分可以省略,没有常数部分说明的成员名对应的值为前一个成员的常数值加 1。第一个枚举数没有初始值设定项,则相应常数的值为 0。常数表达式可以是 Long型范围内的任何值。
例如声明:
Imports System
Private Enum Color
Red
Green = 3
Blue
End Enum
经此定义后枚举成员名称及其关联值为:
Red = 0
Blue = 4
Green = 3
这些值的产生原因如下:
第一个枚举成员 Red没有初始值设定项,被自动赋值为 0。
枚举成员 Green被显式地赋值为 3。
枚举成员 Blue的值为前面的成员 Green值的基础上增加 1,即为 4。
2.4 结 构结构是一个或多个不同数据类型的成员的串联。尽管可以单独访问其各个成员,但结构还是被视为一个独立的单元。
结构的声明以 Structure语句开头,以 End Structure语句结尾。
Structure语句提供结构的名称,即结构所定义的数据类型的标识符。代码的其他部分可以使用这个标识符声明变量、参数和函数返回值的数据类型。
下面的范例显示了结构的声明。
[Public | Protected | Friend | Protected Friend | Private]
Structure structname
{Dim | Public | Friend | Private} member1 As datatype1
..,
{Dim | Public | Friend | Private} memberN As datatypeN
End Structure
Structure和 End Structure语句中间的声明定义了结构的成员。
每个成员都必须使用 Dim 语句声明,或使用指定访问权限的语句声明,如 Public,Private或 Friend。如果使用 Dim语句,默认访问权限是 public(公共)。如:
Public Structure Employee
Public Name As String
Friend WorkPhone As Long
Private HomePhone As Long
End Structure
通过上面的定义之后,Employee就是一个可以使用的合法数据类型名了。
2.5 变 量程序运行时常常需要储存一些临时数据。 Visual Basic像大多数编程语言一样,使用变量来存储这些数据。变量具有名称
(用来引用变量所含值的词)和数据类型(它确定变量可存储的数据类型)两个特性。此外,还涉及变量的生存期及作用范围两个概念。
2.5.1 Visual Basic命名约定
变量的命名要符合 VB.NET的命名约定,名称的首字符必须为字母、汉字或下划线。
可包含字母、汉字、数字和下划线,不能包含空格、小数点以及各种符号。
以下划线开头时,至少还包含一个合法字符。
长度不能超过 1023个字符。
变量名在同一范围内必须惟一。
为了提高代码的可读性,建议:
名称中各单词首字母均为大写,如 FindLastRecord和
RedrawMyForm。
函数名和方法名以动词开始,如 InitNameArray和
CloseDialog。
类名和属性名以名词开始,如 EmployeeName和
CarAccessory。
事件处理程序的名称以一个描述事件类型的名词开始,后面接后缀,EventHandler”,如,MouseEventHandler”。
对于长项或常用项,可使用缩写使名称长度适中,例如,可以使用,HTML”代替,HyperText Markup Language”。
在内部范围中避免使用与外部范围中的名称相同的名称。若变量与同一名称的关键字冲突,则必须在关键字前加适当的类型库以作标识。例如,若一个过程内声明了一个 Date变量,此时,该过程内要调用系统的 Date 函数,只能通过 System.Date
来调用。
2.5.2 变量的范围变量的范围是不必限定变量名便可以引用它的所有代码集。
变量的范围由声明变量的位臵决定。位于给定区域中的代码不必限定在该区域中定义的变量名称便可以引用它。
声明范围时,适用如下规则:
Public关键字声明的公共(全局)变量的可访问性没有任何限制。
模块变量的范围是在其所定义模块的整个命名空间。
局部变量的范围。
块内变量的范围是在其所声明的块中。块是一个以 End、
Else,Loop或 Next语句终止的一组语句。
在 VB.NET中,块内变量不可在块外部访问。但是,变量的生存期仍是整个过程的生存期。不管该变量具有块范围还是过程范围,这一点都不会改变。
2.5.3 变量的生存期除了作用域外,变量还有生存期,对应于两种变量:
动态变量:离开该变量的作用范围后就释放该变量占有的内存单元,这样变量中的原有数据就不复存在。没有使用 Static关键字声明的变量都是动态变量。
静态变量:离开该变量的作用范围后并不释放内存单元,但也不能对该变量进行存取,当以后再次进入该变量的作用范围时,原来变量的值还可以接着继续使用。使用 Static关键字声明的变量属于静态变量。变量的
“生存期”是指变量可供使用的那段时间。用 Dim语句声明的局部变量只在其过程正在执行期间存在。当过程终止时,它的所有局部变量都会消失,
值也会丢失。然而,如果是用 Static关键字声明局部变量,则即使在过程结束后,变量依然存在并且保留其值。
只要应用程序仍在运行,模块变量,shared变量和实例变量就会保留它们的值。
变量的可访问性是由在声明语句中使用的关键字( Dim,Public、
Protected,Friend,Protected Friend 或 Private)所决定的。声明模块、结构、类或实例变量时,可以使用上述任意一个关键字。在过程内部,
只允许使用 Dim关键字,且可访问性总是私有的。
2.5.4变量声明声明语句有 Dim和 Const两个,变量的声明语句只用 Dim。它的位臵和内容决定了变量的特性。
变量声明格式
[{ Public | Protected | Friend | Protected Friend | Private | Static }]
[ Shared ] [ ReadOnly ] Dim ﹤ 变量名 ﹥ [ (boundlist) ] [ ﹐ …] [ As
[ New ] ﹤ 类型 ﹥ ],[ ﹤ 变量名 ﹥ …]
参数说明:
Public:可选项。用 Public关键字声明的变量具有公共访问权限。对于公共变量的可访问性没有任何限制。如果指定了 Public,系统自动省略 Dim
关键字。过程内不可用。
Protected:可选项。只能在类级使用 Protected。用 Protected关键字声明的变量具有受保护的访问权限。仅可以从其自己的类或派生类中访问它们。这就是说可以在类的内部声明受保护的变量,而不能在过程内部以及模块、命名空间进行声明。仅可以用 Protected声明该类的成员。如果指定了 Protected,系统自动省略 Dim关键字。
Friend:可选项。用 Friend关键字声明的变量具有友元访问权限。可从它们的声明上下文内和同一程序中的任何位臵访问它们。 仅可以在模块、
命名空间 Friend。这意味着可以在源文件中或在模块、类或结构内(但不在过程内)声明友元变量。如果指定了 Friend,系统自动省略 Dim关键字。
Protected Friend:可选项。使用 Protected Friend关键字声明的变量同时具有受保护访问权限和友元访问权限。在同一程序集中任何位臵的代码、
变量自身类中的代码和任何派生类中的代码都可以使用这些变量。仅可以在类级使用 Protected Friend。这就是说可以在类的内部声明受保护的友元变量,而不能在过程内部以及模块、命名空间或文件级进行声明。仅可以用 Protected Friend声明该类的成员。如果指定了 Protected Friend,系统自动省略 Dim关键字。
Private:可选项。用 Private关键字声明的变量具有私有访问权限。只可从它们的声明上下文(包括从过程等任何嵌套类型的成员)中来访问它们。只能在模块级使用 Private。这就是说可以在模块、类或结构内部声明私有变量,而不能在命名空间或文件级以及过程内部进行声明。如果指定了 Private,也可以省略 Dim关键字。
Static:可选项。用 Static关键字声明的变量在声明它们的过程终止后保持存在,并保留它们的最新值。仅可以在过程级使用 Static。这意味着可以在过程或过程的块内(但不是在类或模块级)声明静态变量。如果指定了 Static,可以省略 Dim关键字。
在同一变量声明中,不能同时指定 Static和 Shared。
Shared:可选项。指示该变量是共享的。可以通过用类名或结构名限定共享变量来访问它。仅可以在模块、命名空间或文件级使用 Shared。这意味着可以在源文件中或者在模块、类或结构内(但不在过程内)声明共享变量。如果指定了 Shared,也可以省略 Dim关键字。不能在同一个变量声明中同时指定 Static 和 Shared。
ReadOnly:可选项。只能读取但不能写入用 ReadOnly 关键字声明的变量。这在创建引用类型的常数成员,如具有预设数据成员的对象变量时很有用。仅可以在模块、命名空间或文件级使用 ReadOnly。这意味着可以在源文件中或者在模块、类或结构内(但不在过程内)声明只读变量。如果指定了 ReadOnly,也可省略 Dim关键字。
﹤ 变量名 ﹥,必选项。变量名称。必须是有效的 Visual Basic标识符。
可以在同一声明语句中声明任意多的变量,以逗号分隔多个变量。
可以将若干变量声明为具有同一数据类型。还可以指定不同变量或变量组的不同类型。每个变量采用在其 ﹤ 变量名 ﹥ 部分后遇到的第一个 As子句中指定的数据类型。
boundlist:可选项。非负的整数列表,表示数组变量维度的上限。以逗号分隔多个上限。数组可以具有最多 60维。
在 boundlist 中的每个值都指定维度的上限,而不是长度。下限总是为零,因此每一维度的下标在 0 与上限值之间变化。
New:可选项。使对象即刻创建的关键字。如果在声明对象变量时使用 New,则在执行 Dim 语句时会创建该对象的一个新实例。
﹤ 类型 ﹥,变量的数据类型。除非 Option Strict 是 On,否则是可选项。
可以是 Boolean,Byte,Char,Date,Decimal,Double,Integer,Long、
Object,Short,Single 或 String;或者是枚举、结构、类或接口的名称。
可以为每个定义的变量使用单独 As 子句,或者可以通过使用公共 As 子句将若干变量定义为同一类型。如:
Dim IntA,IntB,IntC,IntD AS Int16?IntA,IntB,IntC,IntD为 Short型。
如果没有指定 ﹤ 类型 ﹥,则变量数据类型默认为 Object。
[ ﹐ …]:公共 As 子句中 ﹤ 变量名 ﹥ 的重复。
[ ﹤ 变量名 ﹥ …]:一个 Dim语句可包含多个 As子句。
用 Dim声明的变量对包含 Dim 语句的区域内的所有代码都可用。如果它们是在模块、类或结构中(但在过程外 )声明的,则可从该模块、类或结构中的任何地方访问它们。
“块内变量”的范围是在其所在的块中用 Dim 语句声明的变量。“局部变量”是指在过程内部(非块内)用 Dim语句声明的变量。“模块变量”是在模块的声明部分用 Dim 语句声明的变量。模块的声明部分用 Public关键字声明的“公共变量”具有公共访问权限。
在类或结构中,非局部变量的类别取决于其是否被共享。如果它是用
Shared关键字声明的,它便是“共享变量”,存在于由类或结构的所有实例共享的一个副本中。否则它就是“实例变量”,需要为类或结构的每个实例分别创建该变量的副本。实例变量的给定副本仅能用于为其创建了该副本的实例。
2.5.5 声明级别
2.5.6 变量范围的选择在考虑范围时,记住局部变量对任何类型的临时计算而言都是一个不错的选择。它们仅当其过程运行时才占用内存,而且它们的名称也不容易发生冲突。一般情况下,在声明任何变量或常数时,使其范围尽可能窄(块范围最窄)是好的编程习惯,即“局部优先”原则。这有助于节省内存,
并可最大限度地减少代码错误。同样,仅当有必要在过程调用之间保留值时,才将变量声明为 Static。
2.5.7 名称的大小写敏感性注意:除非应用程序停止运行,否则模块,shared、实例和 static 变量就会占用内存资源。因此,只有必要时才使用它们。
VB.NET 中不区分大小写。例如,ABC和 abc被视为引用同一个已声明元素。但是,公共语言运行库使用区分大小写的绑定。例如,如果用名为 ABC
的元素定义某个类,并且其他程序集通过公共语言运行库使用该类,则它们必须用 ABC来引用此元素。如果以后要重新编译该类并将此元素的名称更改为 abc,则其他使用该类的程序集将无法再访问此元素。因此,在发布程序集的更新版本时,不能更改任何公共元素的字母大小写。
2.6 运算符与表达式运算是对数据进行加工处理的过程,描述各种不同运算的符号称为运算符。参与运算的数据称为操作数。 VB.NET中有算术、赋值、比较、串联、
逻辑 /按位及其他运算符。表达式是由运算符和配对的圆括号将常量、变量、
函数、对象的属性等操作数以合理的形式组合而成的式子。
2.6.1 赋值运算符赋值运算符是最常用的运算符,用于将右边表达式的值赋给左边变量或属性。等号左边的名称可以是简单的变量、属性或数组元素。等号左边的属性仅可以是那些在运行时可写的属性。
VB.NET中有 10个赋值运算符,其运算符的运算含义如表 2-6所示。
2.6.2 算术运算符和算术表达式
1算术运算符算术运算符是最常用的运算符,用来执行简单的算术运算。 VB.NET中有
8个算术运算符,其中只有取负,-”是单目运算符,其余为双目运算符,各运算符的运算含义与数学中基本相同,如表 2-7所示。
2 算术表达式算术表达式是由算术运算符、数值常量、变量和圆括号等组成,其运算结果为数值。表达式的运算规则如下:
运算中的自动类型转换:参加整除的数据带小数,先四舍五入为整数再运算,结果为整数; +,-,* 运算,如果参与运算数据类型相同,结果类型不变。若不同,结果一般为其中占用空间大的类型。,/” 运算结果为双精度型。
对于一个包含各种运算符的表达式,将按照规定的运算符优先级顺序进行运算,运算符的优先级顺序如表 2-8所示。
说明:当多个运算符是同级运算符时,运算顺序从左到右进行。如果表达式中含有圆括号(),则先计算括号内的表达式值,这一点与数学中的计算方法是相同的。
使用 Mod运算符执行求余运算。此运算符返回除数的余数。如果除数和被除数都是整型,则返回值是整数。如果除数和被除数都是浮点型,则返回值是浮点变量。如:
Dim DubA As Double = 53.4,DubB As Double = 4,DubC As Double
DubC = DubA Mod DubB ' c=1.4
3 串联运算符和字符串表达式串联运算符将多个字符串联接为一个字符串。有两个串联运算符 + 和
&,这两个运算符都执行基本串联运算。,&”用来强制两个表达式作字符串连接,而如果 Option Strict 为 Off,,+”运算将根据情况而有些不同:如果两个操作数都是字符串,则将两个字符串连接;如果是数值则进行相加操作。
如,
Dim StrA$,StrB$
StrA = 123 & 456?StrA=”123456”
StrB = 123 + 456?StrB=,579”
&操作符仅定义用于字符串操作数,而且无论 Option Strict 的设臵是什么,都会将其操作数扩展到字符串。对于字符串串联操作,建议使用 &操作符,因为它专门定义用于字符串,可以降低产生意外转换的可能性。
2.6.3 关系运算符和关系表达式
1 关系运算符关系运算符都是双目运算符,其作用是对两个表达式的值进行比较,若关系成立,则返回 True,否则返回 False。
关系运算符的两侧可以是数值表达式、字符串表达式或日期表达式,也可以是表达式的特例,即常量、变量及函数。 VB.NET提供了 8个关系运算符如表 2-9所示,这 8个关系运算符的优先级相同 。
Visual Basic支持 SQL语言中常用的 Like做模糊查询。其格式为:
<Str1> Like <Str2>
<Str1>,<Str2>可以是任意字符串常量、变量及表达式,其中,
<Str2>可使用通配符、字符串列表或字符区间的任何组合。若 <Str1> 与
<Str2>匹配,则结果为 True,否则为 False,如表 2-10所示。这 8种关系运算符的优先级都相同。
Is运算符是对象引用比较运算符,只判断两个对象是否引用同一个对象。
但是,它不执行值比较,如表达式
TypeOf MyControl Is TextBox
如果 MyControl是已定义的文本框控件名,则结果为 True,否则为 False。
下例使用 Is运算符比较两个对象引用。对象变量名称是一般的名称,仅用于说明目的。结果是 Boolean值,它表示两个对象是否相同。
2 关系表达式关系表达式是指用关系运算符将两个表达式连接起来的式子。
〈 表达式 1〉〈 关系运算符 〉〈 表达式 2〉 [〈 关系运算符 〉〈 表达式
3〉 … ]
格式说明:
若 〈 表达式 1〉 与 〈 表达式 2〉 均为数值型时,按数值大小比较。
字符串比较时,按字符的 ASCII码值进行,从左到右一对一比较,直到出现不同的字符为止。如:
" XYZ123" > " XYZABC" 结果为 False
在下例中,显示典型的字符 ASCII码值排序顺序:
︺ <0 <… <9 <A< … <Z <a < … <z <任何汉字其中,︺,表示空格。
数值型与可转换为数值型的数据比较,按数值大小进行比较。
一般不用,2< 5< 3”这样的关系表达式,因为会出现错误的判断。因为 2< 5结果是 True,True<3是 True,因为 True转换为数值型时为 -1( False为
0)。
比较两个浮点数是否相等时,一般用,两数之差的绝对值 <1E-6”,例如,Abs(a-b)<1E-6,结果为 True,则 a=b。
日期型表达式时,其值看成,yyyymmdd”的 8位整数,按值大小比较。
2.6.4 逻辑运算符和逻辑表达式逻辑表达式是指用逻辑运算符连接若干关系表达式或逻辑值而组成的式子。
VB.NET的逻辑运算符有,And,Or,Not,Xor,AndAlso,OrElse分别表示与、或、非、异或、短路逻辑合取、短路逻辑析取。
如果编译的代码可以根据一个表达式的计算结果跳过对另一表达式的计算,则将该逻辑运算称为,短路,。如果第一个表达式的计算结果可以决定运算的最终结果,则不需要计算另一个表达式,因为它不会更改最终结果。
如果跳过的表达式很复杂或涉及过程调用,则短路可以提高性能。
AndAlso 和 OrElse通过短路逻辑求值可减少执行时间。如果 AndAlso运算符的第一个操作数求出的值为 False,则不对第二个操作数求值,结果为
False。类似地,如果 OrElse运算符的第一个操作数求出的值为 True,则不对第二个操作数求值,结果为 True。
And,Or,Not,Xor逻辑运算的真值表如表 2-11所示。
逻辑运算符的优先级顺序,Not,And /AndAlso,Or/Xor/OrElse。
1 移位运算符数学移位不是循环的,即不会将在结果的一端移出的数位从另一端重新移入。在数学移位运算中,丢弃移出的数位,而将另一端空出的数位臵 0。
2 运算符对位模式执行数学左移位。格式:
IntVar = 〈 表达式 1〉 <<〈 表达式 2〉
对 〈 表达式 1〉 左移 〈 表达式 2〉 位,丢弃移出的数位,而将右端(低位端)
空出位臵 0,结果赋给 IntVar。
3 运算符对位模式执行数学右移位。格式:
IntVar = 〈 表达式 1〉 >>〈 表达式 2〉
对 〈 表达式 1〉 右移 〈 表达式 2〉 位,丢弃移出的数位,最左侧的符号位不变,
其他空出位臵 0。数据类型 Byte是无符号的,此时,左端空出的位臵都臵 0,结果赋给 IntVar。
4 格式说明
IntVar:必选项。整型数值。对该位模式进行移位的结果。数据类型与 〈 表达式 1〉 的数据类型相同。
〈 表达式 1〉,必选项。整型数值表达式。要进行移位的位模式。数据类型必须为 Byte,Short,Integer 或 Long。
〈 表达式 2〉,必选项。数值表达式。要将该位模式移位的位数。数据类型必须为 Integer 或扩展到 Integer。
3 运算符的优先顺序在一个表达式中进行算术、关系等混合运算时,VB.NET会按系统给定的顺序进行运算,这个顺序就是运算符的优先级。赋值运算符的优先级最低,
如表 2-12所示。
说明:
同级运算按从左至右的顺序进行计算。
括弧可以改变优先级的顺序,括弧内的计算优先于括弧外的计算。
例如,闰年的定义是:
能被 4整除,但不能被 100整除的年份是闰年。
能被 100整除且能被 400整除的年份是闰年。
写出判断某年份 y是闰年的表达式,可以这样分析:
,能被 4整除,可用表达式 y Mod 4 = 0进行判断。
,不能被 100整除,可用表达式 y Mod 100 <> 0进行判断。
,能被 100整除且能被 400整除,可用表达式 (y Mod 100 = 0 ) And ( y
Mod 400 =0 )进行判断。
所以判断某年份 y是否是闰年的表达式,可以写成:
(y Mod 4 = 0) And (y Mod 100 <> 0 ) or (y Mod 100 = 0 ) And ( y
Mod 400 =0 )
2.7 数组与集合
2.7.1数组的概念
1 数组元素
,数组元素,是用序号来标识的,序号也称之为下标。所以说数组是有序数据的集合。或者说,数组是用一个名字来代表顺序排列的一组数,如图 2-1
所示。
图 2-1 数组的物理含义数组名是 A,共有 10个元素 A( 0)~ A( 9),每个元素的值如表格中的数据所示,如 A( 0) =23,A( 9) =-8。
所以说,数组是用一个名称表示的、逻辑上相关的一组变量。这些变量称为数组元素,用数字下标来区分它们,因此数组元素又称为下标变量。下标变量必须用圆括号括起来。
例如,A( 0),A( 2),A( a*b)都是数组元素,其中 A是数组名,0,2,
a*b是数组的下标。
在许多情况下,数组的应用有助于代码的精炼和简洁,因为可以使用下标设臵循环来高效地处理任何数目的数组元素。
2 数组维数数组可以是一维也可以是多维数组。,维数,或,秩,对应于用来识别每个数组元素的下标个数。 VB.NET维数可以多达 32 维,一般三维以上就很少用了。
所有的数组都是由 System命名空间的 Array类继承而来,且可以在任何数组上访问 System.Array 的方法和属性。例如,Rank 属性将返回数组的秩,Sort 方法将对数组元素进行排序。
注意:当增加一个数组的维数时,多维数组所需的存储空间会急剧增大。
3 数组大小在数组的每一维中,数组元素按下标 0到该维最高下标值连续排列。每一维的长度可以通过 GetLength方法来得到。 VB.NET规定每一维的最小下标值始终是 0,
最大下标值是由该维的 GetUpperBound方法返回的。传递给 GetLength的参数是从零开始计数的。
可以通过数组的 Length属性来获取数组(可含多个秩)的总体大小。这表示该数组中当前包含的元素总数,而不是所占存储空间的字节数。例如,下面的语句声明了一个 5行 10列的二维数组。
Dim Rectangle( 4,9) As Single
多维数组的元素总个数是所有维数大小的乘积。在上面的示例中,元素个数,
即 Rectangle.Length为 50,而 GetUpperBound( 0)为 4。
在 Visual Basic 中,数组没有固定大小。数组在创建以后仍可以改变大小。
ReDim 语句可以更改数组每一维的长度,但维数必须是固定的。
4 数组对象在 VB.NET中,数组是对象,因此每种数组元素都是一个单独的引用类型。
这意味着:
数组变量中含有指向数据的指针,这些数据包含元素、秩和长度信息。
在将一个数组变量赋值给另一个数组变量时,只有指针进行了复制。
两个数组变量只有在具有相同的秩和元素数据类型时,才能看成是同一数据类型的数组变量。
5 数组元素类型数组声明指定一个数据类型,数组的所有元素必须都是该类型数据。如果数据类型是 Object,则单个数组元素可以包含各种类型的数据(如对象、
字符串、数字等等)。可将数组声明为任何基本数据类型、结构或者对象类的数组。
可以声明数组用来处理一组具有相同数据类型的值。一个数组就是一个包含许多单元(用于存储值)的变量,而标量类型的变量(不是数组)只有一个存储单元,只能存放单个值。当要引用数组所包含的所有值时,可以将数组作为一个整体来引用;也可以一次引用一个单独的数组元素。
如果数组的类型是 Object,则可以在数组中混合使用各种数据类型。如:
Dim Rectangle(4,9) As Object,intX As Integer,strA As String
Rectangle(0,0) = 98
Rectangle(0,1) = " VB.NET "
strA = Rectangle(0,1)
intX = Rectangle(0,0)
6 数组的声明数组变量的声明与其他变量的声明一样,使用 Dim 语句,只是在变量名后加上一对或几对圆括号,即可表示它是数组而不是单个值的变量。
声明单维数组变量时,在声明数组变量名后添加一对圆括号,如:
Dim Month(11) As Integer
Dim Month() As Integer = New Integer(11) {}
这两个声明是等效的。每个声明都指定一个初始大小,可以在执行期间通过 ReDim 语句更改这个大小。尽管可在 VB.NET 中更改数组的大小,
但维数必须是固定的。
要初始化元素,可以使用以下语法:
Dim Month() As Integer = {1,2,3,4,5,6,7,8,9,10,11,12}
如果将其中一个维度指定为 –1,则该数组不包含任何元素。使用
ReDim语句可在空数组与非空数组之间转换,如上例语句后加入:
ReDim Month(-1)
则 Month.Length为 0。
声明多维数组变量时,在数组变量名后添加一对圆括号并将逗号臵于圆括号中以分隔维数,如下例所示:
Dim My3DArray(,,) As Short? 3维数组变量
7 初始化数组可以将一个数组变量初始化为声明的一部分。在声明语句中可以进行下列操作之一:
在变量名后的圆括号中指定一个或几个维度的初始长度。
使用 New 子句为变量分配数组对象。使用 New 子句时,其后必须跟随花括号 ( {}),即使当它们为空时也是如此。
为变量分配一个数组对象,并在 New子句中提供初始长度。
为变量分配数组对象并在 New 子句中提供初始元素值。可以在同一 New子句中同时提供长度与值。
如:
Dim MyArray () As Byte = New Byte() {}?声明一个单维空数组
Dim MyArray () As Byte = New Byte() {0,1,2}?初始化单维数组
Dim MyArray (,) As Integer = New Integer(,) {{5,6},{7,8}}?初始化 2维数组在上述最后一个声明中,MyArray初始化为 2维 4个元素,其值分别为:
MyArray (0,0) = 5,MyArray (0,1) = 6,MyArray (1,0) =7,MyArray
(1,1) = 8。
8 调整数组大小通过使用 ReDim 或标准的赋值语句给数组变量赋以不同的数组对象,可以随时改变它的大小。这样有助于您高效管理内存。例如,就可以在短时间内使用一个大型数组,然后通过 ReDim 使其变小。如此可以释放不再需要的内存。
当使用 ReDim 语句改变数组大小时,数组原有的值通常会丢失。但您可以在 ReDim 语句中使用 Preserve 关键字来保持这些值。例如,下面的语句分配一个新的数组,其元素由现有 MyArray 的相应元素初始化,
然后将新数组分配给 MyArray。
ReDim Preserve MyArray(10,20)
在多维数组中,当您使用 Preserve 时只能更改数组的最后一维。如果要更改其他维,将会出现运行时错误。如果不知道某一维的当前大小,
可以使用 GetUpperBound 方法,该方法返回指定维度的最大下标值。如:
ReDim Preserve Mat(Mat.GetUpperBound(0),Mat.GetUpperBound(1)+10) 。
ReDim 语句仅可以在过程级出现。
ReDim 语句用来更改已声明数组的一个或多个维度的大小。不能更改该数组的秩。
ReDim 语句不能更改数组变量的数据类型,或无法提供数组元素的新初始化值。
ReDim 释放现有数组并且创建具有相同秩的新数组。除非指定
Preserve,否则新数组的元素初始化成它们的数据类型的默认值。
如果包含 Preserve关键字,Visual Basic将这些元素从现有数组复制到新数组。使用 Preserve 时,只可以重新调整数组的最后维度的大小,
对于其他每个维,必须指定它在现有数组中已经具有的相同大小。
9 集合( Collection)对象
Collection 对象是可作为一个单元引用的一组有序项,Collection
对象提供了一种将一组相关项作为一个对象进行引用的便捷方法。集合中的项(或成员)只需要存在于集合中即可成为相关项。集合中的成员不需要具有相同的数据类型。
创建集合的方法与创建其他对象相同。例如:
Dim X As New Collection
创建集合之后,可以使用 Add方法添加成员,并使用 Remove 方法移除成员。可以使用 Item方法返回集合中的特定成员,并使用 For
Each...Next 语句遍历整个集合。
尽管集合一般是用来处理对象,但也可以用于处理任何数据类型。有时用集合存取数据比用数组更加有效。如果需要处理的是小型、动态的数据项集,就可能需要使用集合。
下面的代码段展示了如何使用集合来保存和显示 URL 地址列表。
Public URLHistory As New Microsoft.VisualBasic.Collection
Private Sub SaveURLHistory(ByVal URLAddress As String)
URLHistory.Add(URLAddress)
End Sub
Private Sub PrintURLHistory()
Dim URLAddress As String
For Each URLAddress In URLHistory
Debug.WriteLine(URLAddress)
Next URLAddress
End Sub
2.7.2常用内部函数
Microsoft.VisualBasic 命名空间包含构成 VB.NET运行时库的类和模块。该库提供可以在代码中使用的函数、方法和属性。每个模块和类都表示一个特定的功能类别。
1 常用数学函数常用数学函数的参数是数值型,函数返回值也是数值型,如表 2-13所示列出了常用数学函数,它们与数学中的定义略有不同,如三角函数的参数值应是,弧度,值,而不是数学中的,角度,。
2 常用字符串函数
VB.NET在字符存储和处理中,采用了 Unicode编码。 Unicode编码将一个汉字和一个西文字符都视为一个字符,占用两个字节存储。 VB.NET
为用户提供了比较丰富的字符处理函数,如表 2-14所示列出了常用字符串函数。
3 常用日期时间函数日期时间函数主要用来测试和设臵系统日期和时间,如表 2-15所示列出了常用日期时间函数。
4 随机函数随机函数可以产生一个大于等于 0,小于 1的 Single型数据。随机函数的一般格式为:
Rnd当一个应用程序每次启动运行时,都会出现同一序列的随机数,
用 Randomize语句可以消除这种情况。其格式为:
Randomize
例如:
Private Sub Command1_Click()
'Randomize '读者加此句与不加此句都试一下,看看两者的区别
For i = 1 To 10
Print Int( Rnd*10) ‘ 输出 10个 [0,9]范围内的整数
Next
End Sub
5 常用转换函数转换函数主要用于数值型数据与字符型数据之间的转换,数值型数据之间的转换,以及字符与 ASCII码之间、十进制与八进制、十六进制之间的转换,如表 2-16所示列出了常用转换 函数。
6 格式输出函数
Format()函数可以使数值、日期或字符型数据按指定格式输出。
Format()函数的一般格式为:
Format( <表达式 >[,<格式字符串 >])
Format将 <表达式 >的值按 <格式字符串 >指定的格式输出,<表达式 >
任何有效的表达式。
<格式字符串 >为可选项。一个有效的命名或用户定义格式的 String
表达式。如果试图在不指定任何有效的表达式的情况下格式化数字,则
Format函数提供的功能与 Str函数相似。使用 Format函数格式化为字符串的正数不包含为值的符号保留的前导空格,而使用 Str函数转换这些正数时则保留前导空格。
<格式字符串 >是一个字符串常量、字符串变量或字符串表达式,由专门的格式说明字符组成,如表 2-17所示标识了预定义数字格式的名称。这些格式可以按名称用作 Format 函数的 <格式字符串 > 参数。
如表 2-18所示标识预定义的日期格式和时间格式的名称。这些格式可以按名称用作 Format 函数的 <格式字符串 > 参数。
如表 2-19所示标识显示可用于创建用户定义的日期 /时间格式的字符。这些格式字符区分大小写,用作 Format函数的 <格式字符串 >参数。
2.7.3语句格式中符号约定为了便于叙述,本书中语句格式采用统一符号约定如表 2-21所示。如表
2-20所示标识可用于创建用户定义的数字格式的字符。这些字符可用于生成 Format 函数的“格式字符串”参数。
如表 2-20所示标识可用于创建用户定义的数字格式的字符。这些字符可用于生成 Format 函数的“格式字符串”参数。
2.8 实践检验理论巩固
为什么要定义数据类型?
什么是变量?什么是常量?什么是表达式?
如何确定一个变量的作用域?生命期?
如何使用标识符类型字符? VisualBasic.NET提供了哪几种标识符类型字符?
有哪几种数据类型转换?
试述字符串函数 Mid与 InStr的功能。
什么是数组?什么是数组元素?什么是数组的维数?什么是数组的大小?
如果声明数组为 Dim Rectangle(4,9) As Object,那么该数组的大小是多少?
试编程实现产生大于 N且小于 M的随机整数。
写出下列函数的值:
Int(-3.14159) = Str(Sqrt(64)) = Fix(-3.1415926) =
Sign(-7.2 +2) = Lcase(“Hello”) = Mid(“Hello”,2) =
Val(“16Year”) = Str(-459.65) = Len(“Hello”) =
并上机验证结果的正确性,
设计一个获取系统日期、星期、时间的简单应用程序。
上机实战
( 1)为什么要定义数据类型?
( 2)什么是变量?什么是常量?什么是表达式?
( 3)如何确定一个变量的作用域?生命期?