1.变量的作用域和生存周期

    在C#中,变量在进入其作用域时创建,在离开其作用域时被释放,即一旦变量离开它的作用域,就不在保存它的值了。因此,一个变量的生存周期被限制在它自身的作用域内。另外,C#的作用域规则有一点与C/C++不同,即在嵌套的内部作用域定义的变量不能和外部作用域中定义的变量重名。

    例如,以下程序试图在内部作用域内和在外部作用域中分别定义同名的两个变量:

    using System;

    class SameName

     {

       public static void Main()

        {

          int count;

          for(count=0;count<10;count=count+1)

            {

              Console,WriteLine("This is count: " +count);

              int count; //非法,而在C/C++中完全合法,并吟唱了外层count变量

              for(count=0; count<2; count++)

                Console.WriteLine(This program is in error!);

             }

         }

       } 

 

2.使用为初始化的变量

  请看一下代码:

   using System;

   class Uinitial;

   {

       public static void Main() 

       {

           int num;

           Console.WriteLine("\nmy number = {0}",num);

        }

   }

    在C#中,结果程序不会编译,编译器将给出如下所示的错误信息:使用了为赋值的局部变量num.可见,C#不允许使用未被初始化的变量。

   而,在C/C++等其他语言中,上述程序将被编译,在这种情况下,打印的num值是一个机器中的随机数,这个是无用的信息。而C#能防止这种错误的发生。

 

3.定义常量

    在C/C++语言中可以使用#define来定义一个常量,如:#define PI 3.14159 用这种方法定义的常量叫符号常量。这种定义常量的办法在C#语言中不再有效。也就是说,在C#中,常量只能按照用关键字const的方法来定义(这种方法也是C++中提倡的)

    C#中,定义变量的一般格式:

    [属性][修饰符] const 数据类型 常量名=表达式;

    如:const PI=3.14159;

        const bool BTRUE=true;  //定义一个布尔类型的常量

 

4.整数类型相关

     在C/C++语言中,整数类型的常数还有一种以“0”开头的八进制数,如0123,表示八进制的123,即(123)8,相当于十进制数的83。不过,在C#中,认为0123和123都表示十进制的整数123,即C#只支持十进制和十六进制数。现代编程环境中很少再用到八进制了。

     另外,C#中的int 和 long 类型所能表示的范围和运行环境与C/C++中int 和 long 类型有很大的不同。在C/C++中,int 类型占用的存储空间数量依赖于具体的运行平台。例如,在16位处理器平台下,int 类型占用2个字节;而在Intel Pentium处理器上,则取决于具体的操作系统。由于C#应用程序是运行在Windows操作系统 中,int 类型的变量占用了4个字节,所以,C#的各种整数类型已经同机器字长不再有关了。

 

5.字符变量的赋值方法

     在C/C++中,定义为char类型的变量实质就是一个×××类型的变量,其值得范围是 -128~127(是一个字节),如可以这样赋值:

     char ch=97; //这时变量ch就表示是字符'a'了

     而在C#中,不允许使用这样的方法为字符变量赋值,如果希望做这样赋值,则需要用强制类型转换方式,即:

     char ch=(char)97;

     但是,在需要把一个字符型数据赋给一个整数类型变量时,不需要强制类型转换。

 

6.小数类型

     为了适应高精度的财政计算的需要,C#提供了decimal类型。这是一个占用16个字节(128 位)的数据类型,适用于金融货币计算,精度为28-29位有效数字。与其他数据类型不同的是,decimal没有无符号形式。

      注意:C/C++或Java不支持decimal类型,只有C#支持。

     如果我们的应用问题计算的是金额,或执行的是精度非常重要的金融方面的计算时,则应该使用decimal,而不是float或double。因为decimal类型有比float类型或double类型数据高的精度和较小的值域,它不会受到float 和 double类型舍入错误的影响。例如,将10.00减去9.90的结果存储在double变量中,得到的值将为0.99999999999999645,而不是0.10;而如果使用decimal变量来执行这种数学运算,则得到的结果为0.10。

     例子:使用小数类型。

     using System;
     class Hello
    {
      public static void Main()
       {
           decimal balance;
           decimal rate;
           balance=1000.10m;   //decimal类型的值后面必须跟着一个m或M

                                   //否则他被解释成标准的浮点数值,将会

                                   //和decimal数据类型不匹配
           rate=0.1m;
           balance=balance*rate+balance;   //计算金额
           Console.WriteLine("新的平衡:${0}",balance);
       }
     }
 

      程序运行结果:

         新的平衡:$1100.110

  ---------------------------------     

       扩展:

       在计算机中任何一种数值类型都是由表示范围的,如果运算的结果超出了范围,将得不到正确的结果,这种现象称为“溢出”。在C#中,溢出是一种错误,那么在实际应用中,一个数应该属于哪一种数据类型,这完全由程序员指定的,这主要看应用的需要,一般我们可以记住以下几种数据类型和使用方法,其他的类型的使用随着变成经验的增加、自然就能掌握。

       * int 型:凡是要表示带符号的整数时,先考虑使用int型;

       * uint 型:凡是要表示不带符号的整数时,先考虑使用uint型;

       * float 型:凡是需要做科学计算,且精度要求不高时,考虑使用float型;

       * decimal 型:凡是要做金融计算,考虑使用decimal型。

  ---------------------------------

 

7.布尔型

    它是一种用来表示“真”和“假”的逻辑数据类型。占用一个字节的内存,只用两种取值:true 和 false ,并且都是关键字。

    const bool BTRUE=true;  //定义一个布尔类型的常量

    在C语言中,是没有布尔类型变量的,一般定义为“非零值”为真,而“零值”为假。而在C++语言中,增加了布尔型变量,但是也保留了C语言中“非零值”为真、“零值”为假的特性,即一个值为0的整型值或一个null指针都可以转换为“假”的布尔值;而一个非0的整数值或一个非空指针可以转换为“真”的布尔值。但是C#不再支持这种转换,即布尔类型不再同整型量有关,在条件表达式中,不再使用一个返回结果为整型值得算术表达式作为判断真与假的依据,程序中只能显式地将一个整型值与0比较,或将一个对象引用与null比较(即通过关系运算符连接一个关系表达式),才能完成逻辑判断。

    例如:  int a=0;

           if (a) CallFunction(); //在C/C++中正确,但在C#中不允许

           if (a!=0) CallFunction(); //在C/C++和C#中都正确

    在C#中,bool型是个独立的类型,在bool型和其他类型之间没有标准的转换。bool型与整型也是有区别的,并且是相互独立的,它们之间不能相互赋值。

    使用bool举例:

     using System;

     class DataBool

     {

        public static void Main()

         {

           bool b;

           b=false;

           Console.WriteLine("b is {0}",b);

           //一个布尔值能够控制if语句

           if (b) Console.WriteLine("This is executed.");

           b=false;

           if (b) Console.WriteLine("This is not executed.");

           //关系运算符的结果是一个布尔值

           Console.WriteLine("10>9 is {0}",(10>9));

         } 

     }

    程序运行结果:

    b is False

    b is True

    this is executed.

    10>9 is True

  该程序反映了3个现象:第一,Console.WriteLine()输出bool类型的值时,显示的是"True"或"Flase"; 第二,bool型变量的值本身就可以控制if语句,而没有必要写语句 if(b==true); 第三,关系运算符连接的表达式输出的是一个bool类型值,这就是为什么表达式10〉9的显示值为"true"。

   注意:yes,no,on,off都不是C#关键字,这意味着不能布尔型变量设置为这些值,而必须设置为true或false.

 

8.字符串类型

   字符串类型的变量是由关键字string来定义的,它是类System.String的别名。

   常量字符串:(定义如下)

            const string STRVALE="I am astudent";

   我们只要知道:string类型变量是String类型的一个对象。

   然而,在C/C++中没有string类型,所以在C/C++中使用字符数组来表示字符串。例如,在C/C++中用以下语句定义字符串变量:char ch[]="I am a student";

然而,在C#语言中,用字符数组来定义字符串则被认为是“非法”的。所以,在C#中只能使用string类型的变量来表示字符串。