视频讲解
好比一个新生儿必须有一个名字一样,使用变量时,也需要首先对变量进行命名,对变量命名的过程,其实就是声明一个变量。变量在使用之前,必须进行声明并初始化,本节将对变量的声明、简单数据类型、变量初始化,以及变量的作用域进行详细讲解。
声明变量就是指定变量的名称和类型,变量的声明非常重要,未经声明的变量本身并不合法,也无法在程序中使用。在C#中,声明一个变量是由一个类型和跟在后面的一个或多个变量名组成,多个变量之间用逗号分开,声明变量以分号结束,语法如下:
例如,声明一个整型变量mr,然后再同时声明3个字符串变量mr_1、mr_2和mr_3,代码如下:
在声明变量时,要注意变量的命名规则。C#的变量名是一种标识符,应该符合标识符的命名规则。另外,需要注意的一点是:C#中的变量名是区分大小写的,比如num和Num是两个不同的变量,在程序中使用时是有区别的。以下为变量的命名规则:
例如,下面的变量名是正确的:
下面的变量名是不正确的:
在C#语言中允许使用汉字或其他语言文字作为变量名,如“int年龄=21”,在程序运行时并不出现什么错误,但建议读者尽量不要使用这些语言文字作为变量名。
前面提到,声明变量时,首先需要确定变量的类型,那么,开发人员可以使用哪些类型呢?实际上,可以使用的变量类型是无限多的,因为开发人员可以通过自定义类型存储各种数据,但这里要讲解的简单数据类型是C#中预定义的一些类型。
C#中的数据类型根据其定义可以分为两种,一种是值类型,另一种是引用类型。从概念上看,值类型是直接存储值,而引用类型存储的是对值的引用。C#中的数据类型结构如图3.2所示。
图3.2 C#中的数据类型结构
从图3.2可以看出,值类型主要包括简单类型和复合类型两种,其中简单类型是程序中使用的最基本类型,主要包括整数类型、浮点类型、布尔类型和字符类型4种,这4种简单类型都是.NET中预定义的;而复合类型主要包括枚举类型和结构类型,这两种复合类型既可以是.NET中预定义的,也可以用户自定义。本节主要对简单类型进行详细讲解,简单类型在实际中的应用如图3.3所示。
图3.3 简单类型在实际中的应用
整数类型用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整数数据在C#程序中有3种表示形式,分别为十进制、八进制和十六进制。
不能以0作为十进制数的开头(0除外)。
注意
八进制必须以0开头。
十六进制必须以0X或0x开头。
C#中内置的整数类型如表3.1所示。
表3.1 C#内置的整数类型
表3.1中出现了“有符号**”和“无符号**”,其中,“无符号**”是在“有符号**”类型的前面加了一个u,这里的u是unsigned的缩写。它们的主要区别是:“有符号**”既可以存储正数,也可以存储负数;“无符号**”只能存放不带符号的整数,因此,它只能存放正数。例如下面的代码:
例如,定义一个int类型的变量i和一个byte类型的变量j,并分别赋值为2017和255,代码如下:
此时,如果将byte类型的变量j赋值为256,即将代码修改如下:
此时在Visual Studio开发环境中编译程序,会出现如图3.4所示的错误提示。
图3.4 取值超出指定类型的范围时出现的错误提示
分析图3.4中出现的错误提示,主要是由于byte类型的变量是8位无符号整数,它的范围在0 ~ 255,而256这个值已经超出了byte类型的范围,所以编译程序会出现错误提示。
整数类型变量的默认值为0。
浮点类型变量主要用于处理含有小数的数据,浮点类型主要包含float和double两种类型。表3.2列出了这两种浮点类型的描述信息。
表3.2 浮点类型及描述
如果不做任何设置,包含小数点的数值都被认为是double类型,例如9.27,没有特别指定的情况下,这个数值是double类型。如果要将数值以float类型来处理,就应该通过强制使用f或F将其指定为float类型。
例如,下面的代码就是将数值强制指定为float类型。
如果要将数值强制指定为double类型,则应该使用d或D进行设置,但加不加“d”或“D”没有硬性规定,可以加也可以不加。
例如,下面的代码就是将数值强制指定为double类型。
(1)需要使用float类型变量时,必须在数值的后面跟随f或F,否则编译器会直接将其作为double类型处理;另外,也可以在double类型的值前面加上(float),对其进行强制转换。
(2)浮点类型变量的默认值是0,而不是0.0。
decimal类型表示128位数据类型,它是一种精度更高的浮点类型,其精度可以达到28位,取值范围为±1.0×10 –28 ~ ±7.9×10 28 。
由于decimal类型的高精度特性,它更合适于财务和货币计算。
如果希望一个小数被当成decimal类型使用,需要使用后缀m或M,例如:
如果小数没有后缀m或M,数值将被视为double类型,从而导致编译器错误,例如,在开发环境中运行下面代码:
将会出现如图3.5所示的错误提示。
从图3.5可以看出,3.14这个数如果没有后缀,直接被当成了double类型,所以赋值给decimal类型的变量时,就会出现错误提示。
图3.5 不加后缀m/M时,decimal出现的错误
【例3.01】 创建一个控制台应用程序,声明double型变量height来记录身高,单位为米,声明int型变量weight记录体重,单位为千克,根据“BMI=体重/(身高*身高)”的公式计算BMI指数(身体质量指数),代码如下: (实例位置:资源包\源码\03\3.01)
程序运行效果如图3.6所示。
图3.6 根据身高体重计算BMI指数
布尔类型主要用来表示true/false值,C#中定义布尔类型时,需要使用bool关键字。例如,下面代码定义一个布尔类型的变量:
布尔类型通常被用在流程控制语句中作为判断条件。
这里需要注意的是,布尔类型变量的值只能是true或者false,不能将其他的值指定给布尔类型变量,例如,将一个整数10赋值给布尔类型变量,代码如下:
在Visual Studio开发环境中运行这句代码,会出现如图3.7所示的错误提示。
图3.7 将整数值赋值给布尔类型变量时出现的错误
布尔类型变量的默认值为false。
字符类型在C#中使用Char类来表示,该类主要用来存储单个字符,它占用16位(两个字节)的内存空间。在定义字符型变量时,要以单引号(' ')表示,如'a'表示一个字符,而"a"则表示一个字符串,虽然其只有一个字符,但由于使用双引号,所以它仍然表示字符串,而不是字符。字符类型变量的声明非常简单,代码如下:
Char类只能定义一个Unicode字符。Unicode字符是目前计算机中通用的字符编码,它为针对不同语言中的每个字符设定了统一的二进制编码,用于满足跨语言、跨平台的文本转换和处理的要求,这里了解Unicode即可。
Char类为开发人员提供了许多的方法,可以通过这些方法灵活地对字符进行各种操作。Char类的常用方法及说明如表3.3所示。
表3.3 Char类的常用方法及说明
从表3.3可以看到,C#中的Char类提供了很多操作字符的方法,其中以Is和To开始的方法比较常用。以Is开始的方法大多是判断Unicode字符是否为某个类别,例如,是否大小写、是否是数字等;而以To开始的方法主要是对字符进行转换大小写及转换字符串的操作。
【例3.02】 创建一个控制台应用程序,演示如何使用Char类提供的常见方法,代码如下:
(实例位置:资源包\源码\03\3.02)
程序的运行结果如图3.8所示。
图3.8 Char类常用方法的应用
前面讲到了字符只能存储单个字符,但是,如果在Visual Studio开发环境中编写如下代码:
会出现如图3.9所示的错误提示。
图3.9 定义反斜线时的错误提示
从代码表面上看,反斜线“\”是一个字符,正常应该是可以定义为字符的,但为什么会出现错误呢?这里就引出了转义字符的概念。
转义字符是一种特殊的字符变量,以反斜线“\”开头,后跟一个或多个字符,也就是说,在C#中,反斜线“\”是一个转义字符,不能单独作为字符使用。因此,如果要在C#中使用反斜线,可以使用下面代码表示:
转义字符就相当于一个电源变换器,电源变换器就是通过一定的手段获得所需的电源形式,例如交流变成直流、高电压变为低电压、低频变为高频等。转义字符也是,它是将字符转换成另一种操作形式,或是将无法一起使用的字符进行组合。
转义符\(单个反斜杠)只针对后面紧跟着的单个字符进行操作。
C#中的常用转义字符如表3.4所示。
表3.4 转义字符及其作用
【例3.03】 创建一个控制台应用程序,通过使用转义字符在控制台窗口中输出Windows的系统目录,代码如下: (实例位置:资源包\源码\03\3.03)
程序的运行结果如图3.10所示。
图3.10 输出Windows的系统目录
例3.03中输出系统目录时,遇到反斜杠时,使用“\\”表示,但是,如果遇到下面的情况:
从上面代码看到,如果有多级目录,遇到反斜杠时,如果都使用“\\”,会显得非常麻烦,这时可以用一个@符号来进行多级转义,代码修改如下:
变量的初始化实际上就是给变量赋值,以便在程序中使用。首先,在Visual Studio 2017开发环境中运行下面一段代码:
运行上面代码时,会出现如图3.11所示的错误提示。
从图3.11可以看出,如果直接定义一个变量进行使用,会提示使用了未赋值的变量,这说明:在程序中使用变量时,一定要对其进行赋值,也就是初始化,然后才可以使用。那么如何对变量进行初始化呢?
图3.11 变量未赋值时的错误
初始化变量有3种方法,分别是单独初始化变量、声明时初始化变量、同时初始化多个变量,下面分别进行讲解。
在C#中,使用赋值运算符“=”(等号)对变量进行初始化,即将等号右边的值赋给左边的变量。
例如,声明一个变量sum,并初始化其默认值为2014,代码如下:
在对变量进行初始化时,等号右边也可以是一个已经被赋值的变量。例如,首先声明两个变量sum和num,然后将变量sum赋值为2014,最后将变量sum赋值给变量num,代码如下:
声明变量时可以同时对变量进行初始化,即在每个变量名后面加上给变量赋初始值的指令。
例如,声明一个整型变量a,并且赋值为927。然后,再同时声明3个字符串型变量并初始化,代码如下:
在对多个同类型的变量赋同一个值时,为了节省代码的行数,可以同时对多个变量进行初始化。例如,声明5个int类型的变量a,b,c,d,e,然后将这5个变量都初始化为0,代码如下:
上面讲解了初始化变量的3种方法,这时,我们对本节开始的代码段进行修改,使其能够正常运行,修改后的代码如下:
再次运行程序,即可正常运行。
由于变量被定义后,只是暂时存储在内存中,等程序执行到某一个点后,该变量会被释放掉,也就是说变量有它的生命周期。因此,变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,则在编译时会出现错误。在程序中,一般会根据变量的“有效范围”将变量分为“成员变量”和“局部变量”。
在类体中定义的变量被称为成员变量,成员变量在整个类中都有效。类的成员变量又可以分为两种,即静态变量和实例变量。
例如,在Test类中声明静态变量和实例变量,代码如下:
其中,x为实例变量,y为静态变量(也称类变量)。如果在成员变量的类型前面加上关键字static,这样的成员变量称为静态变量。静态变量的有效范围可以跨类,甚至可达到整个应用程序之内。对于静态变量,除了能在定义它的类内存取,还能直接以“类名. 静态变量”的方式在其他类内使用。
在类的方法体中定义的变量(定义方法的“{”与“}”之间的区域)称为局部变量,局部变量只在当前代码块中有效。
在类的方法中声明的变量,包括方法的参数,都属于局部变量。局部变量只有在当前定义的方法内有效,不能用于类的其他方法中。局部变量的生命周期取决于方法,当方法被调用时,C#编译器为方法中的局部变量分配内存空间,当该方法的调用结束后,则会释放方法中局部变量占用的内存空间,局部变量也将会销毁。
变量的有效范围如图3.12所示。
图3.12 变量的有效范围
【例3.04】 创建一个控制台应用程序,使用一个局部变量记录用户的登录名,代码如下: (实例位 置:资源包\源码\04\3.04)
程序运行结果如图3.13所示。
图3.13 使用一个局部变量记录用户的登录名