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);//李四

上面步骤用图来理解如下:
image

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

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



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

image

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

字符串虽然也是引用传递,但是它比较特殊,字符串有不可变性,所以每次赋值新的字符串都等于开辟了一个新的空间

string str1 = "张三";

            string str2 = str1;

            str2 = "李四";

            Console.WriteLine(str1);//张三
posted @ 2021-10-16 17:57  青仙  阅读(56)  评论(0)    收藏  举报