零基础C#学习笔记
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 变量的声明及初始化

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

3.3.1 变量的声明

img

1.声明变量

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

img

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

img

2.变量的命名规则

在声明变量时,要注意变量的命名规则。C# 的变量名是一种标识符,应该符合标识符的命名规则。另外,需要注意的一点是,C# 中的变量名是区分大小写的,比如num 和Num 是两个不同的变量,在程序中使用时是有区别的。下面列出了变量的命名规则。

●变量名只能由数字、字母和下画线组成。

●变量名的第一个符号只能是字母或下画线,不能是数字。

●不能使用C# 中的关键字作为变量名。

●一旦在一个语句块中定义了一个变量名,那么在变量的作用域内不能再定义同名的变量。

例如,下面的变量名是正确的。

img

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

img

学习笔记

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

3.3.2 简单数据类型

img

前面提到,在声明变量时,首先需要确定变量的类型,那么,开发人员可以使用哪些变量类型呢?实际上,可以使用的变量类型是无限的,因为开发人员可以通过自定义类型存储各种数据,但这里要讲解的简单数据类型是C# 中预定义的一些类型。

C# 中的数据类型根据其定义可以分为两种:一种是值类型;另一种是引用类型。从概念上看,值类型是直接存储值,而引用类型存储的是对值的引用。C# 中的数据类型结构如图3.2 所示。

由图3.2 可以看出,值类型主要包括简单类型和复合类型两种,其中:简单类型是程序中使用的基本类型,主要包括整数类型、浮点类型、布尔类型和字符类型4 种,这4 种简单类型都是.NET 中预定义的;复合类型主要包括枚举类型和结构类型,这两种复合类型既可以是.NET 中预定义的,也可以由用户自定义。本节主要对简单类型进行详细讲解,简单类型在实际中的应用如图3.3 所示。

img

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

img

图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# 中内置的整数类型

img

学习笔记

表3.1 中出现了 “有符号**” 和 “无符号**”,其中,“无符号**” 是在 “有符号**”类型的前面加了一个u,这里的u 是“unsigned”的缩写。它们的主要区别是:“有符号**” 既可以存储正数,也可以存储负数;“无符号**” 只能存储不带符号的整数,因此,它只能存储正数。例如,下面的代码:

img

例如,定义一个int 类型的变量i 和一个byte 类型的变量j,并分别赋值为2017 和255,代码如下。

img

此时,如果将byte 类型的变量j 赋值为256,即将代码修改如下:

img

在Visual Studio 中编译程序则会出现如图3.4 所示的错误提示信息。

img

图3.4 取值超出指定类型的范围时出现的错误提示信息

分析图3.4 中出现的错误提示信息,主要是由于byte 类型的变量是8 位无符号整数,它的取值范围为0 ~255,而 “256” 这个值已经超出了byte 类型的变量的取值范围,所以编译程序会出现错误提示信息。

学习笔记

整数类型变量的默认值为0。

2.浮点类型

浮点类型变量主要用于处理含有小数的数据。浮点类型主要包含float 和double 两种类型,表3.2 列出了这两种浮点类型的描述信息。

表3.2 两种浮点类型的描述信息

img

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

例如,下面的代码就是将数值强制指定为float 类型。

img

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

例如,下面的代码就是将数值强制指定为double 类型。

img

学习笔记

当需要使用float 类型变量时,必须在数值的后面跟随f 或F,否则编译器会直接将其作为double 类型处理。另外,可以在double 类型的值前面加上 “(float)” 对其进行强制转换。浮点类型变量的默认值是0,而不是0.0。

3.decimal 类型

decimal 类型表示128 位数据类型,它是一种精度更高的浮点类型,其精度可以达到28 位,取值范围为-7.9×1028 ~7.9×1028

学习笔记

由于decimal 类型的高精度特性,它更适用于财务和货币计算。

如果希望一个小数被当成decimal 类型使用,则需要使用后缀m 或M,如下所示。

img

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

img
img

图3.5 不加后缀m 或M 时编译器出现的错误提示信息

由图3.5 可以看出,“3.14” 这个数值如果没有后缀,就会直接被当成double 类型,所以在赋值为decimal 类型的变量时就会出现错误提示信息。

示例1.根据身高和体重计算BMI 指数

创建一个控制台应用程序,声明double 类型变量height 来记录身高,单位为米;声明int 类型变量weight 来记录体重,单位为千克。根据 “BMI = 体重÷( 身高× 身高)” 计算BMI 指数(身体质量指数),代码如下。

img

学习笔记

第10、14、18 和22 行代码使用了if…else if 条件判断语句,该语句主要用来判断是否满足某种条件,我们将在第4章对其进行详细讲解,这里只需要了解即可。

根据身高和体重计算BMI 指数代码的运行结果如图3.6 所示。

img

图3.6 根据身高和体重计算BMI 指数代码的运行结果

4.布尔类型

布尔类型主要用来表示true 值或false 值,在C# 中定义布尔类型时,需要使用布尔关键字。例如,下面代码定义一个布尔类型变量。

img

学习笔记

布尔类型通常被用在流程控制语句中作为判断条件。

这里需要注意的是,布尔类型变量的值只能是true 或false,不能将其他的值指定给布尔类型变量。例如,将一个整数10 赋值给布尔类型变量,代码如下。

img

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

img

图3.7 将整数赋值给布尔类型变量时出现的错误提示信息

学习笔记

布尔类型变量的默认值为false。

5.字符类型

字符类型在C# 中使用Char 类来表示,该类主要用来存储单个字符,它占用16 位(2字节)的内存空间。在定义字符类型变量时,要以单引号(' ')表示,如'a' 表示一个字符,而"a" 则表示一个字符串。虽然其只有一个字符,但由于使用双引号,所以它仍然表示字符串,而不是字符。字符类型变量的声明非常简单,代码如下。

img

学习笔记

Char 类只能定义一个Unicode 字符。Unicode 字符是目前计算机中通用的字符编码,它为针对不同语言中的每个字符设定了统一的二进制编码,用于满足跨语言、跨平台的文本转换和处理要求,这里了解Unicode 即可。

1)Char 类的使用

Char 类为开发人员提供了许多方法,可以通过使用这些方法灵活地对字符进行各种操作。Char 类的常用方法及说明如表3.3 所示。

表3.3 Char 类的常用方法及说明

img

从表3.3 中可以看到,C# 中的Char 类提供了很多操作字符的方法,其中,以“Is”和“To” 开始的方法比较常用。以 “Is” 开始的方法大多是判断Unicode 字符是否为某个类别,如是否为大/ 小写、是否是数字等;而以 “To” 开始的方法主要用来对字符进行大小写转换及字符串转换的操作。

示例2.Char 类的常用方法的应用

创建一个控制台应用程序,演示如何使用Char 类提供的常用方法,代码如下。

img
img

学习笔记

第3 ~8 行代码声明了5 个不同类型的字符变量,下面的操作都是围绕这5 个字符变量进行的。

第25 行代码主要是为了使控制台界面能够停留在桌面上。

运行上面代码,得到如图3.8 所示的内容。

img

图3.8 Char 类的常用方法的应用

2)转义字符

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

img

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

img

图3.9 定义反斜线时出现的错误提示信息

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

img

转义字符相当于一个电源变换器。电源变换器通过一定的手段获得所需要的电源形式,如交流变成直流、高电压变为低电压、低频变为高频等。转义字符的功能与其类似,它可以将字符转换成另一种操作形式,或者将无法一起使用的字符进行组合。

学习笔记

转义字符 “\” 只针对后面紧跟着的单个字符进行操作。

C# 中的常用转义字符及其作用如表3.4 所示。

表3.4 C# 中的常用转义字符及其作用

img

示例3.输出Windows 的系统目录

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

img
img

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

img

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

学习笔记

在输出系统目录时,如果遇到反斜杠,则使用 “\\” 表示。但是,如果有多级目录,在遇到反斜杠时,如果都使用 “\\”,则会显得非常麻烦。如果遇到下面这种情况:

img

3.3.3 变量的初始化

img

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

img

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

img

图3.11 变量未赋值时出现的错误提示信息

从图3.11 中可以看出,如果在使用变量时直接定义一个变量,则会提示使用了未赋值的变量,这说明在程序中使用变量时一定要对其进行赋值,也就是初始化,然后才可以使用。那么如何对变量进行初始化呢?

初始化变量有3 种方法,分别是单独初始化变量、声明时初始化变量、同时初始化多个变量,下面分别进行讲解。

1.单独初始化变量

在C# 中,使用赋值运算符 “=”(等号)对变量进行初始化,即将等号右边的值赋给左边的变量。

例如,声明一个变量sum 并初始化,其默认值为2017,代码如下。

img

学习笔记

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

img

2.在声明时初始化变量

在声明变量时可以对变量进行初始化,即在每个变量名后面加上给变量赋初始值的指令。

例如,先声明一个整型变量mr 并赋值为927,然后同时声明3 个字符串类型的变量并初始化,代码如下。

img

3.同时初始化多个变量

在对多个同类型的变量赋同一个值时,为了节省代码的行数,可以同时对多个变量进行初始化。

例如,声明5 个int 类型的变量a、b、c、d、e,然后将这5 个变量都初始化为0,代码如下。

img
img

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

img

再次运行代码,即可正常运行。

3.3.4 变量的作用域

img

由于变量被定义后只是暂时存储在内存中,等程序执行到某个点后该变量会被释放,也就是说变量有生命周期,因此,变量的作用域是指程序代码能够访问该变量的区域。如果超出该区域,则在编译时会出现错误。在程序中,一般会根据变量的有效范围将变量分为成员变量和局部变量。

1.成员变量

在类体中定义的变量称为成员变量,成员变量在整个类中都有效。类的成员变量又可以分为两种,即静态变量和实例变量。

例如,在Test 类中声明静态变量和实例变量,代码如下。

img

在该段代码中,x 为实例变量,y 为静态变量(也称为类变量)。如果在成员变量的类型前面加上关键字static,则这样的成员变量称为静态变量。静态变量的有效范围可以跨类,甚至可覆盖整个应用程序。对于静态变量,除了能在定义它的类内存、取,还能直接以 “类名.静态变量” 的方式在其他类内使用。

2.局部变量

在类的方法体中定义的变量(定义方法的 “{” 与 “}” 之间的区域)称为局部变量,局部变量只在当前代码块中有效。

在类的方法中声明的变量(包括方法的参数)都属于局部变量。局部变量只在当前定义的方法内有效,而不能用在类的其他方法中。局部变量的生命周期取决于方法:当方法被调用时,C# 编译器为方法中的局部变量分配内存空间;当该方法的调用结束后,则会释放方法中局部变量占用的内存空间,局部变量也会被销毁。

变量的有效范围如图3.12 所示。

img

图3.12 变量的有效范围

示例4.使用变量记录用户的登录名

创建一个控制台应用程序,使用一个局部变量记录用户的登录名,代码如下。

img

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

img

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