
3.3 变量的声明及初始化
在使用变量时,首先需要对变量进行命名。对变量命名的过程,其实就是声明一个变量的过程。在使用变量之前,必须对其进行声明并初始化。本节将对变量的声明、简单数据类型、变量的初始化,以及变量的作用域进行详细讲解。
3.3.1 变量的声明

1.声明变量
声明变量就是指定变量的名称和类型。变量的声明非常重要,未经声明的变量本身并不合法,也无法在程序中使用。在C# 中,声明一个变量是由一个类型和跟在后面的一个或多个变量名组成的,多个变量之间用逗号分开,声明变量以分号结束,语法如下。

例如,声明一个整型变量mr,再同时声明3 个字符串变量mr_1、mr_2 和mr_3,代码如下。

2.变量的命名规则
在声明变量时,要注意变量的命名规则。C# 的变量名是一种标识符,应该符合标识符的命名规则。另外,需要注意的一点是,C# 中的变量名是区分大小写的,比如num 和Num 是两个不同的变量,在程序中使用时是有区别的。下面列出了变量的命名规则。
●变量名只能由数字、字母和下画线组成。
●变量名的第一个符号只能是字母或下画线,不能是数字。
●不能使用C# 中的关键字作为变量名。
●一旦在一个语句块中定义了一个变量名,那么在变量的作用域内不能再定义同名的变量。
例如,下面的变量名是正确的。

下面的变量名是不正确的。

学习笔记
在C# 中允许使用汉字或其他语言文字作为变量名,如 “int 年龄 = 21”,在程序运行时并不会出现错误,但建议读者尽量不要使用这些语言文字作为变量名。
3.3.2 简单数据类型

前面提到,在声明变量时,首先需要确定变量的类型,那么,开发人员可以使用哪些变量类型呢?实际上,可以使用的变量类型是无限的,因为开发人员可以通过自定义类型存储各种数据,但这里要讲解的简单数据类型是C# 中预定义的一些类型。
C# 中的数据类型根据其定义可以分为两种:一种是值类型;另一种是引用类型。从概念上看,值类型是直接存储值,而引用类型存储的是对值的引用。C# 中的数据类型结构如图3.2 所示。
由图3.2 可以看出,值类型主要包括简单类型和复合类型两种,其中:简单类型是程序中使用的基本类型,主要包括整数类型、浮点类型、布尔类型和字符类型4 种,这4 种简单类型都是.NET 中预定义的;复合类型主要包括枚举类型和结构类型,这两种复合类型既可以是.NET 中预定义的,也可以由用户自定义。本节主要对简单类型进行详细讲解,简单类型在实际中的应用如图3.3 所示。

图3.2 C# 中的数据类型结构

图3.3 简单类型在实际中的应用
1.整数类型
整数类型用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整数类型数据在C# 程序中有3 种表现形式,分别为十进制、八进制和十六进制。
(1)十进制:十进制的表现形式比较常见,如120、0、-127。
学习笔记
不能以0 作为十进制数的开头。
(2)八进制:以0 开头的数,如0123(转换成十进制数为83)、-0123(转换成十进制数为-83)。
学习笔记
八进制数必须以0 开头。
(3)十六进制:以0x/0X 开头的数,如0x25(转换成十进制数为37)、0Xb01e(转换成十进制数为45086)。
学习笔记
十六进制数必须以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。
2.浮点类型
浮点类型变量主要用于处理含有小数的数据。浮点类型主要包含float 和double 两种类型,表3.2 列出了这两种浮点类型的描述信息。
表3.2 两种浮点类型的描述信息

如果不做任何设置,则包含小数点的数值都被认为是double 类型,如9.27,在没有特别指定的情况下,这个数值是double 类型。如果要将数值以float 类型来处理,就应该通过强制使用f 或F 将其指定为float 类型。
例如,下面的代码就是将数值强制指定为float 类型。

如果要将数值强制指定为double 类型,则应该使用d 或D 进行设置,但加不加 “d” 或 “D” 没有硬性规定,可以加,也可以不加。
例如,下面的代码就是将数值强制指定为double 类型。

学习笔记
当需要使用float 类型变量时,必须在数值的后面跟随f 或F,否则编译器会直接将其作为double 类型处理。另外,可以在double 类型的值前面加上 “(float)” 对其进行强制转换。浮点类型变量的默认值是0,而不是0.0。
3.decimal 类型
decimal 类型表示128 位数据类型,它是一种精度更高的浮点类型,其精度可以达到28 位,取值范围为-7.9×1028 ~7.9×1028。
学习笔记
由于decimal 类型的高精度特性,它更适用于财务和货币计算。
如果希望一个小数被当成decimal 类型使用,则需要使用后缀m 或M,如下所示。

如果小数没有后缀m 或M,则数值将被视为double 类型,从而导致编译器错误。例如,在开发环境中运行下面的代码,将会出现如图3.5 所示的错误提示信息。


图3.5 不加后缀m 或M 时编译器出现的错误提示信息
由图3.5 可以看出,“3.14” 这个数值如果没有后缀,就会直接被当成double 类型,所以在赋值为decimal 类型的变量时就会出现错误提示信息。
示例1.根据身高和体重计算BMI 指数
创建一个控制台应用程序,声明double 类型变量height 来记录身高,单位为米;声明int 类型变量weight 来记录体重,单位为千克。根据 “BMI = 体重÷( 身高× 身高)” 计算BMI 指数(身体质量指数),代码如下。

学习笔记
第10、14、18 和22 行代码使用了if…else if 条件判断语句,该语句主要用来判断是否满足某种条件,我们将在第4章对其进行详细讲解,这里只需要了解即可。
根据身高和体重计算BMI 指数代码的运行结果如图3.6 所示。

图3.6 根据身高和体重计算BMI 指数代码的运行结果
4.布尔类型
布尔类型主要用来表示true 值或false 值,在C# 中定义布尔类型时,需要使用布尔关键字。例如,下面代码定义一个布尔类型变量。

学习笔记
布尔类型通常被用在流程控制语句中作为判断条件。
这里需要注意的是,布尔类型变量的值只能是true 或false,不能将其他的值指定给布尔类型变量。例如,将一个整数10 赋值给布尔类型变量,代码如下。

在Visual Studio 中运行这行代码,会出现如图3.7 所示的错误提示信息。

图3.7 将整数赋值给布尔类型变量时出现的错误提示信息
学习笔记
布尔类型变量的默认值为false。
5.字符类型
字符类型在C# 中使用Char 类来表示,该类主要用来存储单个字符,它占用16 位(2字节)的内存空间。在定义字符类型变量时,要以单引号(' ')表示,如'a' 表示一个字符,而"a" 则表示一个字符串。虽然其只有一个字符,但由于使用双引号,所以它仍然表示字符串,而不是字符。字符类型变量的声明非常简单,代码如下。

学习笔记
Char 类只能定义一个Unicode 字符。Unicode 字符是目前计算机中通用的字符编码,它为针对不同语言中的每个字符设定了统一的二进制编码,用于满足跨语言、跨平台的文本转换和处理要求,这里了解Unicode 即可。
1)Char 类的使用
Char 类为开发人员提供了许多方法,可以通过使用这些方法灵活地对字符进行各种操作。Char 类的常用方法及说明如表3.3 所示。
表3.3 Char 类的常用方法及说明

从表3.3 中可以看到,C# 中的Char 类提供了很多操作字符的方法,其中,以“Is”和“To” 开始的方法比较常用。以 “Is” 开始的方法大多是判断Unicode 字符是否为某个类别,如是否为大/ 小写、是否是数字等;而以 “To” 开始的方法主要用来对字符进行大小写转换及字符串转换的操作。
示例2.Char 类的常用方法的应用
创建一个控制台应用程序,演示如何使用Char 类提供的常用方法,代码如下。


学习笔记
第3 ~8 行代码声明了5 个不同类型的字符变量,下面的操作都是围绕这5 个字符变量进行的。
第25 行代码主要是为了使控制台界面能够停留在桌面上。
运行上面代码,得到如图3.8 所示的内容。

图3.8 Char 类的常用方法的应用
2)转义字符
前面讲到了字符类型只能存储单个字符,但是,如果在Visual Studio 中编写如下代码,则会出现如图3.9 所示的错误提示信息。

从代码表面上看,反斜线“\”是一个字符,在正常情况下,它应该是可以定义为字符的,但为什么会出现错误呢?这里就需要了解转义字符的概念。

图3.9 定义反斜线时出现的错误提示信息
转义字符是一种特殊的字符变量,以反斜线“\”开头,后跟一个或多个字符。也就是说,在C# 中,反斜线 “\” 是一个转义字符,不能单独作为字符使用。因此,如果要在C# 中使用反斜线,则可以使用下面的代码表示。

转义字符相当于一个电源变换器。电源变换器通过一定的手段获得所需要的电源形式,如交流变成直流、高电压变为低电压、低频变为高频等。转义字符的功能与其类似,它可以将字符转换成另一种操作形式,或者将无法一起使用的字符进行组合。
学习笔记
转义字符 “\” 只针对后面紧跟着的单个字符进行操作。
C# 中的常用转义字符及其作用如表3.4 所示。
表3.4 C# 中的常用转义字符及其作用

示例3.输出Windows 的系统目录
创建一个控制台应用程序,通过使用转义字符在控制台窗口中输出Windows 的系统目录,代码如下。


输出Windows 的系统目录代码的运行结果如图3.10 所示。

图3.10 输出Windows 的系统目录代码的运行结果
学习笔记
在输出系统目录时,如果遇到反斜杠,则使用 “\\” 表示。但是,如果有多级目录,在遇到反斜杠时,如果都使用 “\\”,则会显得非常麻烦。如果遇到下面这种情况:

3.3.3 变量的初始化

变量的初始化实际上就是给变量赋值,以便在程序中使用。在Visual Studio 2017 中运行下面一段代码。

在运行上面这段代码时,会出现如图3.11 所示的错误提示信息。

图3.11 变量未赋值时出现的错误提示信息
从图3.11 中可以看出,如果在使用变量时直接定义一个变量,则会提示使用了未赋值的变量,这说明在程序中使用变量时一定要对其进行赋值,也就是初始化,然后才可以使用。那么如何对变量进行初始化呢?
初始化变量有3 种方法,分别是单独初始化变量、声明时初始化变量、同时初始化多个变量,下面分别进行讲解。
1.单独初始化变量
在C# 中,使用赋值运算符 “=”(等号)对变量进行初始化,即将等号右边的值赋给左边的变量。
例如,声明一个变量sum 并初始化,其默认值为2017,代码如下。

学习笔记
在对变量进行初始化时,等号右边也可以是一个已经被赋值的变量。例如,首先声明两个变量sum 和num,然后将变量sum 赋值为2017,最后将变量sum 赋值给变量num,代码如下。

2.在声明时初始化变量
在声明变量时可以对变量进行初始化,即在每个变量名后面加上给变量赋初始值的指令。
例如,先声明一个整型变量mr 并赋值为927,然后同时声明3 个字符串类型的变量并初始化,代码如下。

3.同时初始化多个变量
在对多个同类型的变量赋同一个值时,为了节省代码的行数,可以同时对多个变量进行初始化。
例如,声明5 个int 类型的变量a、b、c、d、e,然后将这5 个变量都初始化为0,代码如下。


上面讲解了初始化变量的3 种方法,我们可以利用这些方法对本节开始的代码段进行修改,使其能够正常运行。修改后的代码如下。

再次运行代码,即可正常运行。
3.3.4 变量的作用域

由于变量被定义后只是暂时存储在内存中,等程序执行到某个点后该变量会被释放,也就是说变量有生命周期,因此,变量的作用域是指程序代码能够访问该变量的区域。如果超出该区域,则在编译时会出现错误。在程序中,一般会根据变量的有效范围将变量分为成员变量和局部变量。
1.成员变量
在类体中定义的变量称为成员变量,成员变量在整个类中都有效。类的成员变量又可以分为两种,即静态变量和实例变量。
例如,在Test 类中声明静态变量和实例变量,代码如下。

在该段代码中,x 为实例变量,y 为静态变量(也称为类变量)。如果在成员变量的类型前面加上关键字static,则这样的成员变量称为静态变量。静态变量的有效范围可以跨类,甚至可覆盖整个应用程序。对于静态变量,除了能在定义它的类内存、取,还能直接以 “类名.静态变量” 的方式在其他类内使用。
2.局部变量
在类的方法体中定义的变量(定义方法的 “{” 与 “}” 之间的区域)称为局部变量,局部变量只在当前代码块中有效。
在类的方法中声明的变量(包括方法的参数)都属于局部变量。局部变量只在当前定义的方法内有效,而不能用在类的其他方法中。局部变量的生命周期取决于方法:当方法被调用时,C# 编译器为方法中的局部变量分配内存空间;当该方法的调用结束后,则会释放方法中局部变量占用的内存空间,局部变量也会被销毁。
变量的有效范围如图3.12 所示。

图3.12 变量的有效范围
示例4.使用变量记录用户的登录名
创建一个控制台应用程序,使用一个局部变量记录用户的登录名,代码如下。

使用变量记录用户的登录名代码的运行结果如图3.13 所示。

图3.13 使用变量记录用户的登录名代码的运行结果