什么是值类型?
值类型: 就是非类类型,委托类型,接口类型,string类型的类型称为值类型。
引用类型类型:就是类类型,委托类型,接口类型,string类型称为引用类型。
值类型与引用类型的赋值问题。。。。
值类型的赋值:值类型之间的赋值是创建一个副本,两个完全独立的变量存储一个值。
int x=10;
int y=x;
y=20;
Console.WriteLine(x+" "+y)
输出结果:10 20
因为值类型之间的赋值是创建副本并不是引用,那么你对赋值之后的另一个变量改变值不会影响到另一个变量。这就是值类型。
引用类型的赋值:引用类型的赋值时引用同一个对象,即两个引用类型变量将对同一个对象进行引用,对其中任何一个变量进行操作,都会影响到另一个。
var listTwo=listOne;
listTwo.Add(6);
listTwo.ForEach(x=>Console.Write(x+" "));
Console.WriteLine();
listOne.ForEach(y=>Console.Write(y+" "));
输出结果:
2 3 4 5 6
2 3 4 5 6
因为引用类型变量之间的赋值是将自身所引用的对象交给另一个变量引用,那么他们就引用了同一个对象。即同一个对象那么对象在内存中的地址是被两个对象所引用,那么就形成了引用同一个对象。
如果对其中的一个变量使其引用另一个对象然后修改,他就不会影响到之间赋值的对象,因为他更换了所引用的对象。(变量在栈中的地址是不同的除非在方法参数列表中由ref关键字声明一个类型变量那么变量的地址是相同的)
声明:无论值类型变量还是引用类型变量都是在栈中分配内存的。
而实例/对象的创建是在堆内存中创建的。那么引用类型变量所能实现引用实例是因为,引用类型变量存储了对象在对内存中的地址形成引用。
注意:值类型变量在栈中分配多大的内存给变量是由你声明的变量的类型决定的例:int 32位 则在栈中分配4字节内存给这个变量
当声明引用类型变量的时候,系统直接给其在栈中分配4字节内存给变量用于存储对象在堆中的地址。