第3章 从学习VB.NET基本要素开始学习编程 本章开始,我们将学习如何编写程序代码以实现应用 程序的功能。应用程序中需要处理各种各样的数据, 在开始学习编写程序代码之前,首先需要理解这些数 据如何表示、属于何种数据类型、如何用变量存储数 据以及使用运算符构成表达式对数据进行运算。
章节内容 3.1 数据类型 3.2 变量 3.3 常量 3.4 类型转换 3.5 运算符与表达式
3.1 数据类型 数据是程序必须的组成部分,也是程序 处理的对象。程序中使用的数据一定拥 有某种类型,如数字、字符或日期等, 我们称为数据类型,分为以下两类。 基本数据类型。 复合数据类型。
3.1.1 基本数据类型 VB.NET中有16中不同的基本数据类型, 可以分为以下3类。 数值类。 文本类。 其他数据类型。
数值类 数据类型 表示方式 对应CLS类型 字节数 取值范围 说明 整型 Integer System.Int32 4 -2,147,483,648~2,147,483,647(有符号) 用于表示简单整数 字节型 Byte System.Byte 1 0~255 用于简单算术运算。由于这个类型的变量可以在一个字节中存储,所以运算速度最快 有符号字节型 SByte 无 -128~127(有符号) 短整型 Short System.Int16 2 –32768~32767(有符号) 是整型的一种形式,相对表示范围较小 长整型 Long System.Int64 8 (有符号)-9,223,372,036,854,775,808~9,223,372,036,854,775,807(9.2E+18) 是整型的一种形式,相对表示范围较大 单精度型 Single System.Single 对于负值,为-3.4028235E+38~-1.401298E-45;对于正值,为1.401298E-45~3.4028235E+38 用于存放单精度浮点数
接上表 双精度型 Double System.Double 4 对于负值,为-1.79769313486231570E+308~-4.94065645841246544E-324;对于正值,为4.94065645841246544E-324~1.79769313486231570E+308 用于存放双精度浮点数 小数 Decimal System.Decimal 16 0~±79,228,162,514,264,337,593,543,950,335(±7.9E+28),不包含小数点;0~±7.9228162514264337593543950335,包含小数点右边28位;最小非零数为±0.0000000000000000000000000001(±1E-28) 常用于存储货币值 无符号整型 UInteger 无 0~4,294,967,295(无符号) 无符号短整型 UShort 2 0~65,535(无符号) 无符号长整型 ULong 8 0~18,446,744,073,709,551,615(1.8E+19)(无符号)
什么是CLS? Common Language Specification 这是.NET公用语言规范,可以保证各种 语言组件间的互操作性。 Visual Basic.NET使用的每种数据类型 都与CLS中的一种类型直接对应,这为 构建跨语言集成,保证代码类型安全, 确保用不同语言编写的对象能够起到交 互作用打下了基础。
注意,SByte、UInteger、UShort和 ULong四种类型不符合公共语言规范( CLS),符合CLS的代码不能使用已使用 了该数据类型的组件。 因此如果编写的程序需要供其他语言编 写的程序使用,最好不要使用这4种类 型,而以其他类型如Byte、Integer、 Short、Long等代替。
文本类 数据类型 表示方式 对应CLS类型 字节数 说明 字符串型 String System.String 取决于实现平台 用于存放任何形式的字符串,可以存放0到大约20亿个Unicode字符 字符型 Char System.Char 2 用于存放一个字符,它以0~65535之间数字的形式存储
其他 数据类型 表示方式 对应CLS类型 字节数 说明 日期型 Date System.DateTime 8 范围为0001 年1月1日午夜0:00:00到9999年12月31日晚上11:59:59 布尔型 Boolean System.Boolean 取决于实现平台 取值为True和False 对象型 Object System.Object 4个字节(32位平台),8个字节(64位平台) 任何类型都可以存储在Object类型的变量中
3.1.2 复合数据类型 除了上述16种数据类型以外,VB.NET还 允许用户自定义自己的数据类型,称为 复合数据类型,包括以下3种。 3.1.2 复合数据类型 除了上述16种数据类型以外,VB.NET还 允许用户自定义自己的数据类型,称为 复合数据类型,包括以下3种。 数组。 结构。 类。
3.2 变量 变量是计算机编程中的一个重要概念, 是一个可以存储数据的名称。 变量是值随着程序的运行而变化的量。 3.2 变量 变量是计算机编程中的一个重要概念, 是一个可以存储数据的名称。 变量是值随着程序的运行而变化的量。 下面的代码声明了一个整型的变量intX ,并为它赋值。 1 Dim intX As Integer =1 ' 声明了一 个整型变量intX,并将其值赋为1 2 intX=10 ' 此时,intX值变为10
变量命名规则 Visual Basic中的元素名称必须遵循以 下规则。 必须以字母或下划线(_)开头。 必须只包含字母、十进制数字和下划线。 如果名称以下划线开头,则必须包含至少 一个字母或十进制数字。 长度不能超过1023个字符。 不能是Visual Basic中的关键字。
例如,下面这些变量名都是合法的。 str total x
下面这些变量名都是非法的。 12a ' 以数字开头 ab%c ' 含有非法字符% dim ' 使用VB.NET关键字
VB.NET中的变量名不区分大小写,即下 面这几个名字在VB.NET中将表示同一个 变量。 intX intx INTX
匈牙利命名法(Hungarian) 我们采用小写前缀加上有特定描述意义 的名字的方式来为变量命名,这种命名 方法被称为匈牙利命名法(Hungarian )。 变量名的前3个字母用于说明数据类型 ,第4个字母大写以表示变量的实际含 义,如下面的变量名。 strFileName intTotal
变量声明 VB.NET有两种声明变量的方法。一种是 使用Dim关键字显式声明变量,其语法 格式如下。 Dim 变量名 As 数据类型 例如,Dim intX as Integer。 此行代码声明了一个整型的变量intX。 再例如,Dim intX as Integer,c as Char。 此行代码分别声明了一个整型变量intX和 一个字符型变量c。
另外一种方法是隐式变量声明,即不需 要使用Dim语句显式声明变量,而是在 需要的时候直接使用该变量。 这种方法虽然使用起来方便,但是也容 易带来许多问题,如果将变量名拼错了 ,将会导致一个难以查找的错误。
1 intAppleSold=100 ' 卖掉苹果的数量 2 dblApplePrice=1.5 ' 苹果的价格 3 dblTotal=intAppleSeld*dblApplePrice ' 卖掉苹果的总价 上面3个变量都是隐式声明的,但计算卖掉苹 果总价的语句中,intAppleSold由于输入错 误,写作intAppleSeld。 此时,编译器无法区分这是一个新的变量, 还是输入错误,因此将intAppleSeld作为一 个新的变量对待,导致计算错误。
变量赋值 变量=表达式 表示将赋值运算符右边表达式的值赋给 左边的变量。 例如, intX=10 intX=intX+1 ' 右边表达式可以包含左边的 变量 Dim intX As Integer=10 ' 变量声明时赋 值
3.3 常量 常量是程序运行期间值不发生变化的量 。 VB.NET中的常量分为以下两种。 文字常量。 符号常量。
文字常量 文字常量是直接出现在程序中的数值、 字符或者字符串。 字符和字符串常量是用双引号括起来的 任意字符或者字符的集合。
例子 "a" ' 单个字符 "Hello!" ' 字符串常量 123 ' 十进制 &HA2 ' 十六进制 &O123 ' 八进制 123 ' 十进制 &HA2 ' 十六进制 &O123 ' 八进制 123E8 ' E表示单精度 123D-3 ' D表示双精度
符号常量 符号常量可以为文字常量取一个友好的 名字,以提高程序的可读性。 另外,如果有某个数值需要在程序中多 处使用,也可以将其声明为符号常量, 便于修改。 符号常量声明的语法格式如下。 Const 常量名 As 数据类型=表达式
例子 下面是一些定义符号常量的例子。 通常我们建议将符号常量名全部采用大 写来表示,以示与变量区别。 Const MAXLENGTH As Integer=100 Const MINLENGTH As Integer=1 Const ERROR As String="Input message is too long!" 通常我们建议将符号常量名全部采用大 写来表示,以示与变量区别。
3.4 类型转换 将值从一种数据类型更改为另一种类型 的过程称为类型转换。 3.4 类型转换 将值从一种数据类型更改为另一种类型 的过程称为类型转换。 根据转换的结果是否在目标数据类型的 范围内,类型转换可以分为扩大转换和 收缩转换两种。 扩大转换能够维持原来的数据值,没有数 据损失。 收缩转换从一种较大的类型转到一种较小 的类型,可能会有数据损失,不能维持原 来的数值。
收缩转换的例子 1 Dim X As Single = 123.45 2 Dim Y As Integer 3 Y=X ' Y值为123,整型 第3行在赋值过程中,发生了由单精度 浮点型向整型转换的过程。由于整型不 够精确,不能保持小数点后面的数字, 导致在类型转换小数部分丢失。
隐式转换 上述类型转换是由编译器自动进行的, 不需要在代码中加入任何特殊语法,这 种类型转换称为隐式转换。
转换方向 扩大转换许可的范围,按照 Byte→Short→Integer→Long→Decimal →Single→Double从左至右均可进行转 换,而从右至左的转换则是收缩转换。 由于扩大转换不会造成数据丢失,总是 可以转换成功,因此始终允许隐式执行 。
显式类型转换 VB.NET提供了类型转换关键字,可以强 制转换为所需要的数据类型。 例如, 1 Dim X As Single=123.45 2 Dim Y As Integer 3 Y=Cint(X) ' Y值为123,整型 上面第3行中,使用了CInt关键字强制将括 号中的Single类型变量X转换为Integer类 型。
3.5 运算符与表达式 算术运算符 关系运算符 连接运算符 逻辑运算符 赋值运算符
算术运算符 运算符 作用 +、- 加、减 Mod 取模 \ 整除 *、/ 乘、除 - 取负 ^ 指数
关系运算符 运算符 功能 < 小于 <= 小于或等于 > 大于 >= 大于或等于 = 等于 <> 不等于 Is 对象比较 IsNot Like 字符串模式比较
连接运算符 “&”和“+”两个连接运算符。 “&”专门用于字符串连接;而“+”除 了数值加法运算外,也可以用于字符串 连接。 基本语法格式如下。 result = exp1&或result = +exp2
&连接符 对于“&”运算符来说,exp1和exp2都 应该是string类型或者可以扩大转换为 string类型的表达式,连接结果result 为string类型。 例如 1 Dim str As String 2 str="Hello"&" World" ' str值为“Hello World” 3 str=123&"abc" ' str值为“123abc”
+连接符 对于“+”运算符来说,exp1和exp2可 以是string类型表达式,也可以是数值 表达式。
我们建议对于字符串连接,只使用专用 的字符串连接运算符“&”,而不用 “+”,以消除“+”运算符的多义性, 防止可能出现的错误。 如果exp1是数值型,而exp2是字符串或者 相反,则根据当前Option Struct设置。 On,则产生编译器错误。 Off,则将Strin隐式转换为Double,并执行加法运算;如果String中含有非数值的字符,则隐式转换失败,引发异常。 我们建议对于字符串连接,只使用专用 的字符串连接运算符“&”,而不用 “+”,以消除“+”运算符的多义性, 防止可能出现的错误。
逻辑运算符 运算符 说明 And 逻辑与运算。如果两个表达式都为true,则结果为true Or 逻辑或运算。如果两个表达式中有一个为true,则结果为true。仅两个表达式全为false时,结果才为false Not 逻辑非运算。如果表达式为true,则结果为false;反之如果表达式为false,则结果为true Xor 逻辑异或运算。当两个表达式值不同时,结果为true;相同时(都是true或者都是false)结果为false AndAlso 短路与运算。如果两个表达式都是true,则结果为true。如果第一个表达式就是false,则不计算第二个表达式,直接返回false OrElse 短路或运算。如果两个表达式都是false,则结果为false。如果第一个表达式是true,则不计算第二个表达式,直接返回true
赋值运算符 赋值运算符(=)在3.2.2节为变量赋值 时已经介绍过。 该运算符是计算右边表达式的值并赋值 为左边的变量。 例: dim x as integer x=10
复合运算符 算术运算符和连接运算符还可以和赋值运 算符一起构成复合的赋值运算符,如+=、- =、*=、/=、\=、^=、&=等。 这些运算符同样进行赋值操作,取左边变 量的值与右边表达式进行运算之后,再将 运算结果赋值给左边的变量。
例子 1 Dim num1 As Integer = 10 2 Dim num2 As Integer = 3 3 num1 += num2 ' 等价于num1 = num1 + num2 4 num1 -= num2 ' 等价于num1 = num1 - num2 5 num1 *= num2 ' 等价于num1 = num1 * num2 6 num1 \= num2 ' 等价于num1 = num1 / num2 7 Dim str1 As String = "10" 8 Dim str2 As String = "3" 9 str1 &= str2 ' 等价于str1 = str1 + str2