值类型的变量 VS 引用类型的变量
值类型:结构体,枚举,int、char、bool、decimal、double
引用类型:数组、自定义类、string、接口、集合、object
存储的地方:
值类型的值是存储在内存的栈当中。
引用类型的值是存储在内存的堆当中。
下图展示了值类型与引用类型在计算机中的存储方式
值类型的 int num = 10; 在内存中,是被存储在栈上的空间中;
引用类型的 string s = "123"; 在内存中,堆上地址为0x001001的空间中存储了 “123”,然后,栈上面存储的是堆上空间的地址 0x001001 。
我们自定义的类 Person zs = new Person(); zs.Name = "张三"; 在内存中,堆上地址为0x010101的空间中存储了zs这个对象,包括这个对象的Name属性的值。,然后,我们可以在栈上找到其在堆上的地址0x010101 。
值类型我们称之为值传递,引用类型我们称之为引用传递。
值类型和引用类型的区别:
1. 值类型和引用类型在内存上存储的地方不一样。
2. 在传递值类型和传递引用类型的时候,传递的方式不一样。
3. int、double等类型在未赋予初值的时候,默认值为0;引用类型在未赋予初值的时候,值为null。
class Program { static void SetPersonAge(Person p,int age) { p._Age = age; } static void Main(string[] args) { int i = 10; int j = i++;//先把i的值复制一份赋给j,然后i的值再自增 int k = j; j *= 2; Console.WriteLine("i = {0},j = {1},k = {2}",i,j,k); //输出结果 i = 11,j = 20,k = 10 Person p1 = new Person(20); Person p2 = p1; //p2与p1指向了同一块内存 p1._Age++; //p1对内存中的变量进行操作后,通过p2取出变量的值,变量的值当然会发生改变 Console.WriteLine("p1._Age = {0},p2._Age = {1},", p1._Age, p2._Age); //输出:p1._Age = 21,p2._Age = 21 SetPersonAge(p2, 30);//通过函数来传递的情形也是相同的 Console.WriteLine("After Setage."); Console.WriteLine("p1._Age = {0},p2._Age = {1},", p1._Age, p2._Age); //输出:p1._Age = 30,p2._Age = 30 } public class Person { public int _Age; public Person(int age) { _Age = age; } } }