2.基本数据类型

2. 基本数据类型

实际上,使用VB.NET进行软件开发的一个事实是,和C#等开发语言一样,其数据类型都是定义在.NET Framework中的标准数据类型的别名。 如果我们打开开发环境的Help Library,可以在.NET Framework类库中的System命名空间中看到这些数据类型。

软件开发中,对于基本类型数据的处理是一项非常基础,也是非常重要的工作,无论我们是进行数据计算,还是进行数据的传递,基本类型的数据都是随处可见的;所以,在本章的一开始,我们就给出在VB.NET中常用的数据类型,然后,我们会介绍它们的运用特点;大家也可以在工作中很快的翻到这里参考使用这些数据类型。

下表就是VB.NET与.NET Framework中定义的基本数据类型的对比及取值范围表。

图像说明文字

其中一些数据类型,我们会在后续的内容中详细讨论,如Object类型将在第8章有进一步的讨论、第15章深入讨论String及相关内容、Date类型则会在第16章详细讨论等。

接下来,我们就来讨论基本数据类型的使用,主要包括:

  • 变量与常量
  • 整数
  • 浮点数与Decimal
  • 算术运算
  • 布尔类型
  • 比较运算
  • 字符与字符串
  • 类型转换
  • 更多数据处理

2.1. 变量与常量

在程序中处理数据,我们总不能总是到处写数字吧,学数学还有那么多的符号可以使用呢。代码中,我们同样可以使用符号来表示数据,而且可以分为两种基本类型,即变量和常量。

变量是指在代码运行过程中可以改变其数据的标识符,而常量则是指在代码运行过程中数据不会被修改的标识符。

在子程序(Sub)、函数(Function)或属性(Property)等代码块中,我们使用Dim关键字定义变量,其基本格式如下:

Dim <变量名> As <变量类型>

比如,我们使用Integer类型表示32位的整数,那么,我们定义一个名为num的Integer类型变量,就可以使用如下代码:

Dim num As Integer

定义变量时,我们还可以同时给它们赋值,如:

Dim num As Integer = 99

那么,你一定会想,如果不赋值,num变量的值会是什么呢?

在VB.NET中,如果变量没有被赋值,那么它的值就是其指定类型的默认值,如数值类的默认值是0、布尔类型数据的默认值是False、Object类型默认值为Nothing等等。

如果我们忘记了指定变量类型呢?那么变量的类型就会自动定义为Object,不过,大多数情况下都应该明确指定变量的数据类型。 此外,如果几个变量的类型相同,我们还可以同时定义它们,如:

Dim num1, num2, num3 As Integer

稍后,我们会看到更多数据类型的使用。

定义常量时,我们使用Const关键字,如:

Const PI As Double = 3.1415926

请注意,常量同样需要指定数据类型,必须同时指定其数据,而且在指定数据以后就不能再更改了。

2.2. 整数

整数用于处理没有小数部分的数据,可以分为有符号整数和无符号整数。其中,有符号整数可以处理负整数、零和正整数,而无符号整数则只能处理零和正整数。

在本章的一开始,我们就给出了在VB.NET可用的整数类型,并给出了它们的取值范围,大家可以参考使用。随后的内容,我们更多的以32位整数为例来讨论整数的应用问题,我们使用的类型包括Integer和UInteger,而其它类型整数的处理,可以参考本部分介绍的内容进行操作。

2.3. 浮点数与Decimal

浮点数包括两种,即Single和Double,和Decimal类型数据一样,它们都可以处理带有小数部分的数据。只是它们的取值范围、运算精度上会有所区别,当然,在内存占用和执行的效率上,也会存在一些不同。

2.4. 算术运算

在VB.NET中,可用的算术运算包括:

  • 加运算,使用+运算符。
  • 减运算,使用-运算符。
  • 乘运算,使用*运算符。
  • 整除运算,使用\运算符,运算结果为长整数(Long)。运算执行前,将运算数尝试转换为Long类型,转换规则为“四舍六入五成双”原则,即小数部分最高位是4时直接舍去、是6时整数部分加1、是5时整数部分变为最接近的偶数。
  • 除运算,使用/运算符,运算结果将保留相应精度的小数部分。
  • 取模运算,也就是取余数运算,使用Mod运算符。保留整除后的部分,可能是整数或浮点数,这和C风格的取模运算方法是不同的。
  • 求幂运算,使用^运算符,如3^2=9。请注意,此运算符的运算结果总是为Double类型。

下面的代码,我们演示了几种运算符的使用。

Module Module2
    Sub Main()
        Dim num1 As Integer = 100
        Dim num2 As Integer = 33
        Console.WriteLine("{0}+{1}={2}", num1, num2, num1 + num2)
        Console.WriteLine("{0}-{1}={2}", num1, num2, num1 - num2)
        Console.WriteLine("{0}*{1}={2}", num1, num2, num1 * num2)
        Console.WriteLine("{0}\{1}={2}", num1, num2, num1 \ num2)
        Console.WriteLine("{0}/{1}={2}", num1, num2, num1 / num2)
        Console.WriteLine("{0} Mod {1}={2}", num1, num2, num1 Mod num2)
    End Sub
End Module

使用Ctrl+F5执行本代码,我们会得到如下图所示的运行结果。

图像说明文字

虽然每一种编程语言都定义了运算符的运算优先级,但完全无误地记住它们并不是一件容易的事情,所以,在处理运算顺序时,使用小括号比完全依靠默认的运算符优先级会更安全。

2.5. 布尔类型

布尔(Boolean)类型数据,又称为逻辑类型数据,只包括两个可能的值,即True(真)和False(假),而它的运算方法却不少。如:

  • 与运算,使用And运算符,如m And n,当m和n都为True,运算结果才为True,否则运算结果为False。
  • 或运算,使用Or运算符,如m Or n,当m或n有一个为True时,运算结果就为True,m和n都为False时,运算结果才为False。
  • 取反运算,使用Not运算符,如Not True运算结果为False,Not False运算结果为True。
  • 异或运算,使用Xor运算符,当两个运算数不同时,运算结果为True,否则运算结果为False。

如下面的代码,演示了这些逻辑运算符的使用。

Console.WriteLine(True And False)
Console.WriteLine(True Or False)
Console.WriteLine(Not True)
Console.WriteLine(True Xor True)

执行此代码,我们可以得到如下图所示的结果。

图像说明文字

除上上述的基本逻辑运算,在VB.NET中,我们不可以使用如下一些逻辑运算符,如:

  • AndAlso,具有短路功能的与运算符,如m AndAlso n中,当m的值为False时,不再计算n的值,直接返回运算结果False。很多情况下,这种方法可以有效提高代码的执行效率,特别是当计算n的值需要消耗较多时间和系统资源,或者m为必要条件的时候。
  • OrElse,具有短路功能的或运算符,如m OrElse n中,当m的值为True时,不再计算n的值,直接返回运算结果True。

2.6. 比较运算

比较数据的大小,相信大家都不会陌生,在VB.NET中,我们可以使用的比较运算符主要有:

  • =运算符,如m=n判断m和n是否相等。请注意,在VB中等于和赋值都使用=运算符,大家应该根据代码功能加以区分。
  • <>运算符,如m<>n判断m和n是否不等。
  • <运算符,如m<n判断m是否小于n。
  • >运算符,如m>n判断m是否大于n。
  • <=运算符,如m<=n判断m是否小于或等于n。
  • >=运算符,如m>=n判断m是否大于或等于n。

比较运算的结果是一个布尔(Boolean)类型的数据,其结果只有两个,即True值表示成立,False值表示不成立。

2.7. 字符与字符串

在VB.NET中,字符和字符串内容都使用一对英文字符的双引号包含,如"A"、"ABC",那么,我们如何区分它们是字符还是字符串呢?

当我们需要处理一个字符时,应该使用字符(Char)类型,当我们指定一个字符内容时,可以在其后面使用字母c来告诉编译器,如:

Dim ch As Char
ch = "A"c

对于字符串,现在,我们只需要知道使用双引号可以定义一个字符串,而且,可以使用&运算符来连接两个字符串,如下面的代码:

Dim str1 As String = "abcd"
Dim str2 As String = "defg"
Console.WriteLine(str1 & str2)

在第15章,我们会看到更多关于字符串应用的内容。

2.8. 类型转换

在实际开发工作中,我们经常会遇到将一种数据类型转换成另外一种数据类型的工作,在VB.NET中,我们会有很多方法来完成这些转换方法,本节,我们就来讨论其中一些基本的方法。

一般来讲,在代码中进行数据类型的转换可以分为隐式转换和显式转换(也称为强制转换)。

隐式转换。本章开始的时候,我们已经看到了各种类型数据所支持的数值范围,当我们将取值范围小的类型赋值给取值较大的数据类型时,即可以完成隐式的类型转换;反之,则可能出问题,因为取值小的数据类型无法正确保存大于其取值范围的数据。

代码会自动进行隐式的数据类型转换,大多数情况并不会有问题,但如果我们需要确切的数据类型时,就应该手动进行显式的转换。

显式转换。显式的数据类型转换就是指我们在代码中使用一定的转换方法,将一种数据类型明确地转换为另外一种数据类型。

下面,我们就来介绍一些在VB.NET中常用的数据类型转换方式。

2.8.1. VB类型转换函数

使用过VB6的朋友,一定都知道一系列由大写字母C(Convert)开头的转换函数,在VB.NET中,我们依然可以使用这些函数,如:

  • CByte()函数,将参数转换为Byte类型数据。
  • CShort()函数,将参数转换为Short类型数据。
  • CUShort()函数,将参数转换为UShort类型数据。
  • CInt()函数,将参数转换为Integer类型数据。
  • CUInt()函数,将参数转换为UIntger类型数据。
  • CLng()函数,将参数转换为Long类型数据。
  • CULng()函数,将参数转换为ULong类型数据。
  • CSng()函数,将参数转换为Single类型数据。
  • CDbl()函数,将参数转换为Double类型数据。
  • CDec()函数,将参数转换为Decimal类型数据。在VB.NET中已不再使用Currency,所以不再提供CCur()函数。
  • CBool()函数,将参数转换为Boolean类型的数据。
  • CDate()函数,将参数转换为Date类型的数据,和DateTime结构类型相同。
  • CStr()函数,将参数转换为String类型的数据。
  • CObj()函数,将参数转换为Object类型,这个函数实际意义并不大,因为在VB.NET中,任何类型的数据都可以直接赋值为Object类型的变量。

请注意,当参数不能正确转换为目标类型时,会产生异常(Exception),在代码中,我们必须正确处理这些异常才能保存代码的运行。不过,我们会从整个项目中数据处理工作的全局来考虑类型转换和异常处理的问题,在本书后续的内容中,我们会逐渐了解相关方法。

2.8.2. Convert类

Convert类定义在System命名空间,它的功能与VB类型转换函数相同,即将指定的数据转换成另外一种数据类型。与一系列VB类型转换函数不同的只是对于类中方法的命名。

在VB类型转换函数的名称中,都使用一定的缩写形式,而在Convert类中定义的转换方法,统一使用了“To+<.NET Framework数据类型名称>”格式,如我们需要将一个数据转换为32位整数时,使用VB类型转换函数可以写成:

Dim str As String = "123"
Dim num As Integer = CInt(str)

而使用Convert类,我们则需要写成如下代码形式:

Dim str As String = "123"
Dim num As Integer = Convert.ToInt32(str)

请注意,使用Convert类中的方法转换数据类型时,如果参数不能正确转换成目标类型,同样会产生异常,这和VB类型转换函数的表现是相同的。

关于更多的.NET Framework数据类型名称,可以参考本章开始时的对照表。

2.8.3. TryParse()方法

TryParse()方法定义在基本数据类型中,它的功能是尝试将字符串类型转换为指定的数据类型。与上述两种数据类型转换方式不同,TryParse()方法不会产生异常,如下面的代码。

Dim str As String = "123"
Dim result As Integer
If Integer.TryParse(str, result) Then
    Console.WriteLine("转换成功")
Else
    Console.WriteLine("转换失败")
End If

虽然TryParse()方法不会产生异常,但它也有一些不足,比如,它的源数据类型必须是字符串(String),它的目标类型只能是值类型(如基本数据类型中除String和Object以外的数据类型)。

2.9. 更多数据处理

在一些行业软件中,我们可能需要很专业的运算方法,比如,在System命名空间中的Math类为我们定义了常用的数学计算方法及数据。 此外,在Microsoft.VisualBasic命名空间中的Financial模块中定义了一些财务计算函数,我们可以在VB.NET代码中直接使用这些函数。

相信这些数据处理的资源在专业软件中会大有用处,大家可以参考MSDN Library了解详细的使用方法。

更多类型的数据处理,如字符串、枚举、结构、类、数组等内容,我们会在后续内容中逐渐展开讨论。

目录

  • 前言
  • 1.概述
  • 2.基本数据类型
  • 3.程序流程控制
  • 4.代码组织与封装
  • 5.枚举
  • 6.结构
  • 7.面向对象编程
  • 8.类的继承
  • 9.接口
  • 10.设计模式基础
  • 11.事件与委托
  • 12.泛型
  • 13.异常处理
  • 14.数组与集合
  • 15.字符串与散列算法
  • 16.日期与时间
  • 17.文件系统
  • 18.图形图像
  • 19.网络
  • 20.数据库应用基础
  • 21.创建数据层组件
  • 22.获取系统信息
  • 23.Windows窗体应用代码封装
  • 24.ASP.NET应用开发基础