值类型:int double char decimal bool enum struct(存储在栈中)
引用类型:string 数组 自定义类 集合 object 接口(存储在堆中)
值类型在复制的时候,传递的是这个值得本身。
1 2 3 4 5 6 |
int n1 = 10; int n2 = n1; n2 = 20; Console.WriteLine(n1);//输出n1=10; Console.WriteLine(n2);//输出n2=20; Console.ReadKey(); |
引用类型在复制的时候,在堆中没有重新开辟空间,传递的是对这个对象的引用地址。两个地址指向堆中同一个空间,其中一个地址改变会导致另一个地址也发生改变(string特殊 字符串的不可变性 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
案例一: Person p1 = new Person(); p1.Name = "张三"; Person p2 = p1; p2.Name = "李四"; Console.WriteLine(p1.Name);//输出 张三 传递的地址改变了原来的地址也发生改变 Console.ReadKey(); 案例二: static void Main(string[] args) { Person p = new Person(); p.Name = "张三"; Test(p); Console.WriteLine(p.Name);//输出李四 Console.ReadKey(); } public static void Test(Person pp) { Person p = pp; p.Name = "李四"; } |
特殊引用类型:string
string 会在堆中继续开辟一个新的空间,地址改变不会改变其地址指向空间中的内容。
1 2 3 4 5 6 |
string s1 = "张三"; string s2 = s1; s2 = "李四"; Console.WriteLine(s1);//输出是s1=张三 Console.WriteLine(s2);//输出s2=李四 Console.ReadKey(); |
ref使返回的形参改变实参的值
1 2 3 4 5 6 7 8 9 10 11 12 |
static void Main(string[] args) { int number = 10; TestTwo(ref number); Console.WriteLine(number); Console.ReadKey(); } public static void TestTwo(ref int n) { n += 10; } |