23值传递和引用传递
值传递和引用传递
值类型在复制的时候,传递的是这个值得本身。
引用类型在复制的时候,传递的是对这个对象的引用(在堆中的内存地址)。
比如:
写一个类
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
下面通过复制值类型和引用类型来得出结论
//值传递
int a1 = 10;
int a2 = a1;
a2 = 20;
Console.WriteLine(a1);//10
Console.WriteLine(a2);//20
//引用传递
Person p1 = new Person();
p1.Name = "张三";
Person p2 = p1;//这里是直接给的引用(内存地址),也就是没有new开辟空间,两个对象都用一个空间
p2.Name = "李四";
Console.WriteLine(p1.Name);//李四
上面步骤用图来理解如下:

可以看到,在复制对象给p2时,他们的引用都一样

这样通过方法传参数也是传引用

ref原理也是将值传递变为引用传递

可以看到,在调用方法时,里面的参数和外面的参数在栈上地址一样

字符串虽然也是引用传递,但是它比较特殊,字符串有不可变性,所以每次赋值新的字符串都等于开辟了一个新的空间
string str1 = "张三";
string str2 = str1;
str2 = "李四";
Console.WriteLine(str1);//张三

浙公网安备 33010602011771号