值类型和引用类型
好久没更新了,出来透透气。。。。
在网上发现很多关于值类型和引用类型的问题,说一下自己的理解()...
值类型:在作为参数传递时被复制(即,它们通过值来传递)。
引用类型:类类型、接口类型、数组类型或委托类型。
值类型是存储在堆栈上的,对值类型变量赋值将创建所赋的值的一个副本。
引用类型分配在托管堆中,一个引用类中的值类型分配在托管堆中,对引用类 型变量赋值将创建引用的副本,而不是引用对象的副本。
上面的两个代码片断可以很清楚的看到值类型和引用类型的区别,ok,继续执行下面的代码:
在网上发现很多关于值类型和引用类型的问题,说一下自己的理解()...
值类型:在作为参数传递时被复制(即,它们通过值来传递)。
引用类型:类类型、接口类型、数组类型或委托类型。
值类型是存储在堆栈上的,对值类型变量赋值将创建所赋的值的一个副本。
1 int i = 0;
2 int j = i;
3 i= 1;
4 Console.Write("i={0},j={1}",i,j);
运行结果为:i=0,j=1;j不随着i的改变而改变。2 int j = i;
3 i= 1;
4 Console.Write("i={0},j={1}",i,j);
引用类型分配在托管堆中,一个引用类中的值类型分配在托管堆中,对引用类 型变量赋值将创建引用的副本,而不是引用对象的副本。
1 class test
2 {
3 /// <summary>
4 /// 应用程序的主入口点。
5 /// </summary>
6 [STAThread]
7 static void Main(string[] args)
8 {
9 ObjectPrint OF = new ObjectPrint();
10 OF.num = 5;
11 ObjectPrint OT = OF;
12 OT.num = 6;
13 Console.Write("i={0},j={1}",OF.num,OT.num);
14 }
15 }
16 class ObjectPrint
17 {
18 public int num=0;
19 }
运行结果为:i=6,j=6;OF.num随着OT.num的改变而改变。因为他们指向同一个引用。2 {
3 /// <summary>
4 /// 应用程序的主入口点。
5 /// </summary>
6 [STAThread]
7 static void Main(string[] args)
8 {
9 ObjectPrint OF = new ObjectPrint();
10 OF.num = 5;
11 ObjectPrint OT = OF;
12 OT.num = 6;
13 Console.Write("i={0},j={1}",OF.num,OT.num);
14 }
15 }
16 class ObjectPrint
17 {
18 public int num=0;
19 }
上面的两个代码片断可以很清楚的看到值类型和引用类型的区别,ok,继续执行下面的代码:
1 string Snum = "0";
2 string Snumt = Snum;
3 Snumt = "1";
4 Console.Write("Snum={0},Snumt={1}",Snum,Snumt);
运行结果为:Snum=0,Snumt=1;string也是引用类型,为什么同是引用类型会有不同的情况产生。因为string是一个比较特殊的引用类型,string之间的赋值是开辟了一块内存将源string拷贝到目标string,在实际的赋值过程中传递的是值。
2 string Snumt = Snum;
3 Snumt = "1";
4 Console.Write("Snum={0},Snumt={1}",Snum,Snumt);