代码改变世界

c#值类型和引用类型

2012-01-30 22:15  javaspring  阅读(229)  评论(0编辑  收藏  举报

值类型和引用类型:

第一: 这两种类型存储在内存的不同地方:值类型存储在堆栈中,而引用类型存储在托管堆上。
注意区分某个类型是值类型还是引用类型,因为这种存储位置的不同会有不同的影响。


例如:int是值类型,这表示下面的语句会在内存的两个地方存储值20:

int i,j;
i = 20;
j = i;


但考虑下面的代码,这段代码假定已经定义了一个类Vector,Vector是一个引用类型,它有一个int类型的

成员变量Value:


Vector x,y
x = new Vector();
x.Value = 30;
y = x;
Console.WriteLine(y.Value);
y.Value = 50;
Console.WriteLine(x.Value);


执行这段代码,只有一个Vector对象,x和y都指向包念该对象的内存位置,即x和y引用值为同一个,即指向内存地址相同的对象。
因为X和Y是引用类型的变量,声明这两个变量只是保留了一个引用一一而不会实例化给定类型的对象。要

创建对象就必须使用new关键字。

如果变量是一个引用,就可以把其值设置为null,表示它不引用任何对象:
y = null;
如果将引用设置为null,显然就不可能对它调用任何非静万言书的成员函数或字段,这么做会在运行时抛

出一个异常。


在C#中基本数据娄型如bool和long都是值类型。。如果声明一个bool变量,并给它赋予另一个bool变量的

值,在内存中就会有两个bool值,如果以后修改第一个bool值,第二个bool变量的值也不会改变。这些类

型是通过值来复制的。

相反,大多数更复杂的C#数据类型,包括我们自己声明的类都是引用类型。它们分配在堆中,其生存期可以跨多个函数调用,可以通过一个或几个别名来访问。

CTS类型:
例如,要把int i 转换为string,可以编写下面的代码:
string s = i.Tostring();
应强调的是,类型实际上仍存储为基本类型。基本类型在概念上用.net结构表示,没有性能损失。

下面看看C#中定义的类型,我们将列出每个类型,以及它们的定义和对应.net类型(CTS类型)的名称。C#有15个预定义类型,其中13个是值类型,2个是引用类型(string和object).

预定义的值类型:
内置的值类型表示基本数据类型,例如整型和浮点类型、字符类型和bool类型。
C#支持8个预定义整数类型。


浮点类型
C#提供了许多整型数据类型,也支持浮点类型

decimal类型
decimal类型表示精度更高的浮点数。