2.2 变量和常量
变量是指在程序运行的过程中,值可以发生变化的量。常量是指在程序运行的过程中,值不会发生变化的量。在声明常量时,需声明程序中要用到的常量名称并对它进行赋值。常量可以是任何一种值类型或引用类型。例如,圆周率PI就是一个常量,因为它的值是不变的。
2.2.1 命名变量
变量的命名要有意义,要能见名知其意。这样能给代码的维护和阅读带来极大的方便,也是读者应该要练习和养成的良好编程习惯。除了以下这些规则以外,笔者推荐学习匈牙利命名法。关于该命名法,在本书7.3.3节中有介绍,读者可以参考或提前学习。变量的命名规则如下:
· 变量名必须以字母开头,名字中间只能由字母、数字和下画线“_”组成;
· 变量名的长度不能超过255个字符;
· 变量名在有效的程序范围内必须是唯一的;
· 变量名不能是保留字(关键字),但可以把保留字嵌入变量名。
例如:命名一个学生的名字StuName,这样一眼就看出是学生名字的变量。
提示:C#语言对大小写是很敏感的,这是.NET公共类型规范CTS中的特性。但是在VB.NET中不区分大小写。VB.NET通过CLR编译成中间语言后,系统自动做了类型转换,是VB.NET的编译环境自动完成的。所以从整个.NET平台来看,是区分大小写的。
在C#语言中,不能使用没有初始化的变量。在C#语言的面向对象里,对象的成员变量由编译器负责清零。而局部变量,则由程序员负责清零。
2.2.2 声明和使用变量
在C#语言中,变量有很多种类型,可分为静态变量、局部变量、实例变量、数组变量、值参数、引用参数、输出参数7种。
通过“static”声明的变量就是静态变量。静态变量在创建并被加载后即能生效。无论创建了多少个静态变量,它都只会有一个副本。例如,声明一个静态变量static int i=1;。
注意:在声明静态变量时,最好为它赋值,这样才是安全的。
局部变量就是只在局部作用域里发生作用的变量。它的生效范围定义在它的代码块内。块指的就是两个大括号“{”“}”之间,在块内可以是一条语句,也可以有多条或者空语句。局部变量从开始声明的地方生效,当块结束后,局部变量也消失了。
【范例2-5】下面来演示局部变量的声明和使用。在主函数中分别输出变量名相同的变量值,但是两个变量的作用范围不同,它们只是局部发生作用,如示例代码2-5所示。
示例代码2-5
01 using System; //包含基本类和基类 02 …… //还有其他命名空间,也是系统生成,在此省略 03 namespace Ex_2_5 //程序的命名空间,也是项目名称,如Ex_2_5 04 { 05 class Program 06 { 07 static void Main(string[] args) //主函数,也是入口函数 08 { 09 Program data = new Program();//创建对象,Program是一个类,在第4章中有 //介绍 10 data.fnTest1(); //输出fnTest1()中的i 11 data.fnTest2(); //输出fnTest2()中的i 12 Console.ReadLine(); //获取输入焦点,为了看运行结果 13 } 14 public void fnTest1() //公有函数fnTest1() 15 { 16 int i; //局部变量,它的作用范围只在fnTest1()中 17 i = 100; //必须先赋值才能使用 18 Console.WriteLine(i); //输出fnTest1中的i 19 } 20 public void fnTest2() //公有函数fnTest2() 21 { 22 int i; //此处的i作用范围只在fnTest2()中 23 i=200; //必须先赋值才能使用 24 Console.WriteLine(i); //输出fnTest2中的i 25 } 26 } 27 }
【运行结果】选择“调试”|“启动调试”选项运行程序,结果如图2.8所示。
图2.8 整数的声明
【代码解析】可以看出,在上述代码中含有两个同名的整型局部变量i。但是由于它们的作用域不同,所以互不影响。没有“static”修饰的变量就是实例变量。当一个类被实例化以后,就生成了属于该类的实例变量。当执行了类的析构函数后,它生成的实例变量就会失效。
注意:在C#中,局部变量必须先赋值,然后才能使用。
2.2.3 声明和使用常量
在C#中定义常量的方式有两种:一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。两者之间的区别如表2.2所示。
表2.2 静态常量和动态常量的区别和联系
1.静态常量的使用
用const关键字来声明静态常量。例如声明一个公有的静态常量MAX并赋值public const int MAX=10;静态常量在声明时必须赋值。但是用const来声明常量时,在类型上有很多限制。首先,要声明的类型必须属于值类型,然后,声明的类型初始化不能通过new来完成。因此,一些用struct声明的值类型常量也不能用const来声明。
2.动态常量的使用
相对于const关键字而言,使用readonly来声明动态常量则要灵活得多。如声明一个公有的动态常量MAX并赋值public readonly int MAX=10;系统会为readonly所声明的常量分配内存空间,就像类的其他成员一样拥有独立的空间。此外,readonly所声明的常量除了在声明时可以赋值外,还可以在类的构造函数中进行赋值。由于readonly所声明的常量相当于类的成员,因此使用readonly不像const关键字那样有类型限制,可以用readonly去声明任何类型的常量。
注意:在程序设计中,一般常量都用大写字母来表示,例如圆周率PI在程序中定义为常量时就写成PI。