C#系列三《C#数据类型与变量一》

 一 数据类型与变量的介绍

     在程序运行的过程中计算机需要记录大量的状态 数据(这里我们统称数据)。那这些数据都存放在哪呢?程序在运行过程中的数据一般都存放在内存。那么他们在内存中如何存放的一种描述就是数据类型。变量则就是数据类型的实体。那么我们来看一个例子: 假如现在需要设计一个程序计算整数 10 与 20 的和, 请看如下代码:

 1 using System;
 2 
 3 namespace MyProgram
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             //变量的定义格式:
10             //数据类型 变量名 赋值运算符 值
11             int a = 10// 定义一个整数类型的变量a 并赋值10
12             int b = 20// 定义一个整数类型的变量b 并赋值20 
13 
14             int c = a + b;//定义一个整数类型的变量b 赋值为 a + b 的和 
15             
16             Console.WriteLine("10 + 20 = "+c.ToString());//打印结果
17         }
18     }
19 }

分析: 首先要计算整数10与20的和,肯定需要有地方来放(在内存中存储)它们,既然计算整数那么我们就用整数的数据类 型int 定义名字为a 和 b的变量来分别存放10 和 20,在通过加法运算符将和存放在变量c中。调用我们之前了解过的控制台类将结果输出到控制台显示出来,这里要注意c.ToString(), 因为我们计算的是整数,所使用变量的类型都是整数,而控制台输出的是字符串,所以我们需要将调用int类型的一个行为ToString()将自己转换为字符串类型!这部分将在数据类型的第三篇中介绍!

二 C#基本数据类型与变量

    1.数据类型

        C#的数据类型分为两类:一种是值类型 一种是引用类型 (值类型与引用类型将在数据类型的第二篇中介绍),那么我们来看看C#的常用数据类型。      

数据类型

说明

范围

系统类型

int

有符号的32位整数

-2147483648~2147483647

System.Int32

uint

无符号的32位整数

0~4294967295

System.Uint32

long

有符号的64位整数

-9223372036854775808~

9223372036854775807

System.Int64

Ulong

无符号的64位整数

0~18446744073709551615

System.Uint64

Char

16Unicode字符

U0000~UFFFF

System.Char

Float

32位浮点数

1.5 * 10-45~3.4 * 1038

System.Single

double

64位浮点数

5.0 * 10-324~1.7* 10308

System.Double

decimal

96位带符号数

100~1028

System.Decimal

bool

表示真或假

True False

System.Boolean

String

表示char类型的集合

与系统内存地址空间有关

System.String

object

所有类型的基类

有所类型

System.Object   

 

    2.匿名类型

       了解C#常用的基础数据类型以后,我们在来看看匿名类型,什么是匿名类型呢?

       匿名类型:匿名类型就是在变量初始化后根据所赋的值来判断它属于哪个类型。不明白没关系,举个例子:

   

 1 using System;
 2 
 3 namespace MyProgram
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             int a = 20//定义一个整数类型的变量
10             char b = 'A';//定义一个字符类型的变量
11 
12             var _intType = 20//定义一个匿名类型的变量 给赋值一个整数数字 20 
13             var _charType = 'A'//定义一个匿名类型的变量 给赋值一个字符 A
14 
15             Console.WriteLine(" a 的数据类型为:{0}",a.GetType().ToString()); //打印出变量a的数据类型
16             Console.WriteLine(" b 的数据类型为:{0}", b.GetType().ToString()); //打印出变量b的数据类型
17 
18             Console.WriteLine(" _intType 的数据类型为:{0}", _intType.GetType().ToString());//打印出变量_intType的数据类型
19             Console.WriteLine(" _charType 的数据类型为:{0}", _charType.GetType().ToString());//打印出变量_charType的数据类型
20         }
21     }
22 }

    首先看 9 ~ 10行,定义了一个整数类型的变量a赋值为20和一个字符类型的变量b为赋值为A,那么 a与b的数据类型分别为整数类型(System.Int32与System.Char).

    接着看 12 ~ 13行,定义了两个匿名类型的变量为: _intType,_charType,分别给 _intType赋了一个整数的值为20,给_charType赋了一个字符为A。在程序运行之前编译器会根绝变量所赋的值来自动判断数据类型。

    程序执行结果如下:

   

    提示:匿名类型变量在编译后确定数据类型之后,在程序作用域内该变量的数据类型不可改变!

    3.变量与变量的作用域

    变量:经过上面的例子与介绍应该已经对变量不陌生了,变量就是数据类型的实例。真正用来存放数据的内存空间或存放数据内存空间地址。

    作用域:作用域就是程序使用该变量的一个范围。一般变量作用域的边界是由符号{与}来划定界限的,也就是说在{}内定义的变量,就只能在{}内部来调用。

    C#的作用域可分为两种级别:

         1.类属性级别:当变量定义为类的属性是,变量的作用域为整个类的内部可访问。

         2.局部级别:当变量被定义在方法或者语句块中,变量的作用域为最近的{}之间可访问,局部级别的变量必须初始化

    关于作用域的问题:

          1.当一个类定义的变量(属性)与该类方法中定义的局部变量重名时会怎么样?

          答:当前作用域中的变量与上级作用域中的变量重名时,以当前作用域中的变量为准。

          2.当一个类定义的变量(属性)重名或者类方法中定义的局部变量重名时会怎么样?

          答:同一个作用于中不能出现相同名称的变量

    参考代码: 

    class MyClass
    {
        
int a = 10;

        
public void MyMethod()
        {
            
int a = 20//方法内部变量与类属性变量 a同时出现时, 以当前方法内(作用域的变量为准)
            Console.WriteLine("a:{0}",a); //输出结果为20

            
int a = 30// 编译错误,同一个作用域内不可以出现相同名称的变量
        }
    }

 

三  数据类型默认值与初始化

     C#中类定义属性可以不用初始化,那么他们的值分别是什么呢? 未赋值的变量会被自动赋予一个合适的默认值。

     例如: int 类型(数值类型)默认值为0

              bool 类型 默认值为false

              char 类型 默认值为 ‘\0’

     我们还可以在定义类属性是就初始化他们的值,也可以通过类的构造函数来初始化类属性

 1     class MyClass
 2     {
 3         public int a = 10//第一种初始化方法在定义是就赋值
 4         public bool b; //默认值为false
 5         public MyClass(bool c)
 6         {
 7             b = c; //通过构造函数初始化类属性
 8         }
 9     }
10 
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             MyClass mc = new MyClass(true);//通过构造函数传入true 赋给参数bool类型变量c = true
16             Console.WriteLine("mc->a :{0}", mc.a.ToString());
17             Console.WriteLine("mc->b :{0}",mc.b.ToString());
18         }
19     }

输出结果如下:


四  静态变量

     静态变量就是通过类级别去调用,无需创建类型的对象就可以用的变量。

     静态变量关键字: static

     定义格式: [static 数据类型 变量名]

     实例代码:

 1 using System;
 2 
 3 namespace MyProgram
 4 {
 5     class MyClass
 6     {
 7         public int a = 10//变量a为对象级别属性
 8         public static int b = 20//变量b为类级别属性
 9     }
10 
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             MyClass mc = new MyClass();
16             int a_Mc = mc.a; //变量级别需要创建对象MC后通过MC(对象)来访问
17 
18             int b_MyClass = MyClass.b; //类属性可直接通过类名访问无需创建对象
19 
20             Console.WriteLine("mc->a :{0}", a_Mc);
21             Console.WriteLine("MyClass->b :{0}", b_MyClass);
22         }
23     }
24 }

     运行结果如下:
五  常量

     常量就是不能被改变的变量,常量只能定义在类属性级别,常量也必须是静态的,并且在定义时就初始化赋值,常量一旦被初始化后就不可以在改变,任何对常量改变语句都将引起编译器错误。因为常量定义时就要赋值所以常量类型只能声明给值类型(值类型与引用类型下篇讲解)。

     常量的定义格式: [const 数据类型 变量名]

    代码:

 1 using System;
 2 
 3 namespace MyProgram
 4 {
 5     class MyClass
 6     {
 7         public const int a = 10//定义常量a
 8         public const bool b = false//定义常量b
 9     }
10 
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             int a_Const_MyClass = MyClass.a; //常量必须是静态的,通过类名访问
16 
17             bool b_Const_MyClass = MyClass.b; //常量必须是静态的,通过类名访问
18 
19             Console.WriteLine("MyClass->a_Const :{0}", a_Const_MyClass.ToString());
20             Console.WriteLine("MyClass->b_Const :{0}", b_Const_MyClass.ToString());
21 
22             //任何试图修改常量的动作都会引起编译错误
23             MyClass.a = 20;   
24             MyClass.b = true;
25         }
26     }
27 }

正确操作运行结果如下:

修改常量提示错误如下:
六  只读与静态只读

     回顾下常量在声明时必须初始化赋值,那么如果我想在运行的时候才赋值怎么办?那么不用怕C#为我们提供了只读类型关键字为:readonly ,只读类型跟常量类似也是赋值后就不可以改变,但与常量不同的是它不是强制静态的,也就是只读类型是对象级别来访问的。

     只读类型定义方式:[readonly 数据类型 变量名]

     那么如何让他成为静态的? 很简单在前面我们已经介绍过静态的关键字static

     静态只读类型定义方式:[static readonly  数据类型 变量名]

    代码:

 1 using System;
 2 
 3 namespace MyProgram
 4 {
 5     class MyClass
 6     {
 7         public readonly int a = 10//定义只读变量a
 8         public static readonly bool b = false//定义静态只读变量b
 9     }
10 
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             MyClass mc = new MyClass();
16             int a_ReadOnly_MC = mc.a; //只读变量是非静态的,由对象级别访问
17 
18             bool b_StaticReadOnly_MyClass = MyClass.b; //静态只读变量是类级别变量,有类名访问
19 
20             Console.WriteLine("a_ReadOnly_MC : {0}",a_ReadOnly_MC);
21             Console.WriteLine("b_StaticReadOnly_MyClass :{1}", b_StaticReadOnly_MyClass);
22 
23             //任何对只读类型的修改都将引起编译错误
24             mc.a = 20;
25             MyClass.b = true;
26         }
27     }
28 }

正确操作运行结果如下:

修改只读变量错误如下:

七  需要注意的细节

      1.变量作用域是否可以出现相同变量名?

      答:相同作用域时,变量不可以重名,在当前作用域与上级作用域的变量重名时,以变量所在作用域为主。

      2.常量是否可以在对象级别访问?

      答:常量不可以在对象级别访问,常量默认为静态的,由类级别访问。

      3.常量(const)与(readonly)只读的区别?

      答:相同点:是都是赋值后就不可以改变,

            不同点:1.Const 必须在声明时就赋值,readonly 可以在初始化过程中赋值.

                       2.Const只可以修饰值类型,而readonly可以修饰任意类型.

                       3.Const是类级别访问,readonly是对象级别访问

八  备注

      以上讲解的类的属性都代表成员变量,当讲到类属性时会更正概念!今天就到这里下下一篇将介绍《C#数据类型与变量二》值类型与引用类型

posted @ 2011-05-02 20:08  王波洋  阅读(3246)  评论(3编辑  收藏  举报