C# 值传递和引用传递

一、首先介绍一下值类型和引用类型:

值类型:int ,double,char,decimal,bool,enum,struct类型都是值类型。
引用类型:string ,数组,自定义类,集合,object,接口都是引用类型。

二、两者在内存的区别:值类型存在堆上,引用类型存在栈上。

三、值传递和引用传递。

static void Main(string[] args)
        {
            int n1 = 10;
            int n2 = n1;
            n2 = 20;
            Console.WriteLine(n1);
            Console.WriteLine(n2);
            Console.ReadKey();
        }

不难得到结论,输出是:
输出结果
备注:值类型传递的时候,传的是他的本身。
(把n1的值复制了一下给了n2,当执行“n2 = 20”的时候,把20赋值给了n2。)
下图是原理的解释,这个应该不难:
原理解释

好的,我们看引用类型传递(自定义类)

class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Name = "张三";
            Person p2 = p1;
            p2.Name = "李四";

            Console.WriteLine(p1.Name);
            Console.WriteLine(p2.Name);
            Console.ReadKey();
        }
    }

    public class Person
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

结果却是:

这里写图片描述
按照一开始的想法,应该是 张三、李四才对,那么这就是引用类型的传递。我们逐步解释。
备注:引用类型在复制的时候,传递的是对这个对象的引用或者地址。
引用类型复制的时候,既然复制的是对象的引用或者地址,那么一开始实例化的一个p1,他在栈上的地址比如说100001,指向堆上的 new Person(),然后实例化了一个p2,把p1复制给了p2,我们说引用类型复制的时候,复制的是对象的引用或者地址,那么p2和p1在栈上的地址是一样的,(但还是开辟了两个栈地址),他们两个都是指向堆的同一个空间。
所以p1和p2只要有一个改变,那么他们两个都会随之改变!

画图解释:
这里写图片描述

例子:

class Program
    {
        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

static void Main(string[] args)
        {
            string s1 = "张三";
            string s2 = s1;
            s2 = "李四";
            Console.WriteLine(s1);
            Console.WriteLine(s2);
            Console.ReadKey();
        }

这个按照上面的介绍,引用类型传递的时候,两个之中的任意一个改变,那么就会全部改变,但是,输出却是这样的:
这里写图片描述
这是因为字符串的不可变性!String就是引用类型之中的特例,面试的时候很多面试官会挖坑让你跳。

谢谢浏览,如有不妥之处,请提出批评,一定及时修改,见谅。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值