21天学通C#
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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。