C#实践教程(第2版)
上QQ阅读APP看书,第一时间看更新

2.3 变量

变量和常量相当于为数据值指定的名称。程序往往不是针对明确数据的,如一个程序的功能是根据长和宽,求一个矩形的面积。若只是固定长和宽的矩形,则直接用数据进行计算即可;而使用了变量的程序,通过变量作为长和宽的名称,则改变变量的值,可求解出多个矩形的面积。

本节介绍变量的定义、命名规则、作用域和生命周期等。

2.3.1 变量的声明和初始化

程序中的变量可以理解为数学中的变量,在数学函数中,x是一个没有确定值的数,如椭圆函数、抛物线函数、双曲线函数等,图形根据x的值而变化,程序中的变量也是如此。

变量由两部分构成,一个是变量的名称,另一个是变量的值。如x=56,则变量名称为x,值为56。

变量存储可以变化的值,变量可以被声明,可以被初始化,可以被赋值。对于声明、初始化和赋值的作用,如下所示。

声明 告诉系统,这个变量(数据)的存在,系统将根据数据类型为其分派存储空间。

初始化 为变量指定一个初始的值。

赋值 为变量指定一个值。

变量为一段有名称的连续存储空间,在源代码中通过定义变量来申请并命名这样的存储空间,并且通过变量的名称来使用这段存储空间。

在C#中,变量就是存取信息的基本单元。对于变量,必须明确变量的名称、类型、声明以及作用域。另外,变量的值可以通过重新赋值或运算符运算后被改变。

C#中,用户可以通过指定数据类型和标识符来声明变量。如定义整型变量,名称为num,则定义语句如下所示:

int num;
或者
int num=26;

上述语法代码中涉及3个内容:int、num和=26。其具体说明如下:

int 定义变量类型为整型。

num 变量名称,也叫标识符。

=26 “=”在C#中为赋值符,该符号右边的值26为变量的初始值,值类型初始值默认为0。若该符号在变量声明后出现,则变量的值将被修改为新的值。

初始化变量是指为变量指定一个明确的初始值,初始化变量时有两种方式:一种是声明时直接赋值;另一种是先声明、后赋值。如下代码分别使用两种方式对变量进行初始化:

char usersex = '男';                         //直接赋值
或者
string username;                             //先声明
username = "陈洋洋";                         //后赋值

另外,多个同类型的变量可以同时定义或者初始化,但是这些变量中间要使用逗号分隔,声明结束时用分号结尾,如下所示:

string username, address, phone, tel;      //声明多个变量
int num1 = 12, num2 = 23, result = 35;     //声明并初始化多个变量

C#中初始化变量时需要注意以下事项:

□ 变量是类或者结构中的字段,如果没有显式的初始化,默认状态下创建这些时初始值时为0。

□ 函数中的变量必须进行显式的初始化,系统不允许使用未赋值的变量,以维护代码的安全。

2.3.2 变量的修饰

在变量的声明语句中,可以对变量使用修饰符进行修饰,常见的修饰有7种类型:静态变量、实例变量、数组元素、值参数、引用参数、输出参数以及局部变量。

变量通常在类和函数中进行声明,类中的变量又称作类的字段,可以被类中的任何函数调用;而函数中声明的变量只能在函数内部使用。它们的具体说明如下所示:

静态变量 它是指使用static修饰符声明的变量。

实例变量 与静态变量相对应,是指未使用static修饰符声明的变量。

数组元素 它是指作为函数成员参数的数组,它总是在创建数组实例时开始存在,在没有对该数组实例的引用时停止存在。

值参数 是指在方法中未使用ref或out修饰符声明的参数。

引用参数 它是指使用ref修饰符声明的参数。

输出参数 它是指使用out修饰符声明的参数。

局部变量 它在应用程序的某一段时间内存在,局部变量可以声明在块、for语句、switch语句和using语句中。

提示

参数是在方法的定义和调用时使用的,将在本书第5章介绍。

2.3.3 变量的命名规则

变量的声明需要为其指定一个名称,但变量的命名并不是任意编写的。在C#中为变量命名时需要遵循以下几条规则。

□ 变量名称必须以字母开头。

□ 变量名称只能由字母、数字和下划线组成,而不能包含空格、标点符号、运算符等其他符号。

□ 名称要为有实际意义的名称,方便对程序的理解和维护。

□ 变量名称不能与库函数相同。

□ 变量名称不能与C#中的关键字名称相同,关键字是C#语法中被赋予特殊含义和用法的单词或词组。

提示

C#中有一点是例外的,那就是允许在变量名前加前缀@。在这种情况下可以使用前缀@加上关键字作为变量的名称,这样可以避免与其他语言进行交互时的冲突。但是一般不推荐读者使用前缀@命名变量。

2.3.4 C#中的关键字

关键字是程序中有着特殊含义和用法的词,如定义命名空间时使用的“namespace”关键字、定义类时使用的“class”关键字,以及引用命名空间时使用的“using”关键字,都有着指定的用法。

关键字不能作为变量的名称,以避免在使用时与变量发生混淆。常见的关键字如表2-5所示。

表2-5 C#中的关键字

每一个关键字都有着确定的用法,常见的关键字及其用法如下所示。

base 用于访问被派生类或构造中的同名成员隐藏的基类成员。

catch 定义一个代码块,在特定类型异常抛出时,执行块内代码。

const 标识一个可在编译时计算出来的变量值,即一经指派不可修改的值。

enum 表示一个已命名常量群集的值类型。

finally 定义一个代码块,在程序控制流离开try代码块后执行。参见try和catch。

foreach 用于遍历一个群集的元素。

goto 一个跳转语句,将程序执行重定向到一个标签语句。

namespace 定义一个逻辑组的类型和命名空间。

sizeof 一个操作符,以B(Byte)为单位返回一个值类型的长度。

throw 抛出一个异常。

try 异常处理代码块的组成部分之一。

typeof 一个操作符,返回传入参数的类型。

using 当用于命名空间时,using关键字允许访问该命名空间中的类型,而无须指定其全名。也用于定义finalization操作的范围。

2.3.5 变量的作用域和生命周期

变量并不是在整个项目的运行中都有效的,它有着自己的作用域(作用范围)和生命周期。一般情况下需要通过以下规则确定变量的作用域。

□ 只要变量所属的类在某个作用域内,其字段(即成员变量)也在该作用域中。

□ 局部变量存在于声明该变量的块语句或方法结束的大括号之前的作用域。

□ 在for和while循环语句中声明的变量只存在于该循环体内。

如在命名空间下定义一个类,类中定义一个函数;并在类和函数中分别定义变量,如练习2-2所示。

【练习2-2】

在命名空间Homework下定义类Program及其内部的函数Main()、Show(),在Main()函数内分别定义变量j和变量i,在Main()外定义变量num,代码如下:

using System;
namespace Homework
{
   class Program
   {
      int num=30;
      static void Main()
      {
         int j=20;
         int i=5;
         Console.WriteLine(i+j+num);
      }
      static void Show()
      {
         Console.WriteLine(num);
      }
   }
}

上述代码中,变量num在类的定义之内,在函数Main()之外,因此num可以被类中所有函数调用,其生命周期与类的声明周期一致;而变量j和i在函数Main()内部,只能在Main()内部使用,其生命周期与Main()函数一致。而同在一个类中的函数Show()可以使用变量num,不能使用Main()函数中的变量j和i。

变量的作用域只在某一个范围内有效,是相对于定义状态的;而变量的生命周期是相对于运行状态的,即程序运行某个方法时方法中的变量有效,当程序执行完某个函数后,函数中的变量也就消失了。