c#引用参数传递的深入剖析

本文详细解析了C#中的值类型和引用类型的差异,通过具体示例阐述了这两种类型在参数传递过程中的行为特点,特别是对于引用类型如何通过ref关键字实现真正的引用传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在c#中,数据有2中基本类型:值类型和引用类型

值类型的变量存储数据,而引用类型的变量存储对实际数据的引用。

在参数传递时,值类型是以值的形式传递的,是将要传递的参数的值复制给函数的形参,因此在函数体类对于该形参的任何改变都不会影响原来的值;

引用类型是以对象引用的形式传递的,是将要传递的对象的引用复制给函数的形参,这时形参是实参引用的复制,注意:是引用的复制,而不是原引用,和原引用指向相同的对象,因此对于引用对象所做的更改将会直接影响原来的值,但是对于引用本身,在函数内的任何改变将不会影响原引用。

给一个直观的示例:

    class A
    {
       public  string data="";
    }
    class Program
    {
        static void F(  A a1)
        {
            //a1指向传来的对象a            
            a1.data = "2";//修改a1指向的对象
            a1 = new A();//a1指向另一个对象,注意,这时a1已经不指向原来的对象a了,而原来的引用还是指向对象a
            a1.data = "3";//修改新建的对象,不会影响原来对象a的值
        }
        static void Main()
        {
            A a = new A();//实例化A的一个对象,并用a1指向该对象
            a.data = "1";//将a的data字段赋值为"1"
            F(a);//调用函数F,注意:这时将对象a的引用(不是对象a)赋值给参数a1,
            Console.WriteLine(a.data);
        }
    }
结果是2而不是3也不是1.
ref 串参数:
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:
对于值类型,可以向上面的引用串参数一样传递,对于已经是引用类型的参数,大家可能会说那不是多此一举吗?其实不然,因为其中的实机理完全不一样:
考查上个示例的变种
    class A
    {
       public  string data="";
    }
    class Program
    {
        static void F( ref A a1)
        {
            //a1和a是同一个实例,而不是指向同一对象的引用,即a1和a在存在于内存中的地址是一样的
            a1.data = "2";//修改a1指向的对象
            a1 = new A();//a1指向另一个对象,理所当然别名a也指向该对象了,注意,这时原来的对象已经没有任何引用指向了,因此,可以说原来的对象已经不可访问了。
            a1.data = "3";//修改新建的对象的属性
        }
        static void Main()
        {
            A a = new A();//实例化A的一个对象,并用a1指向该对象
            a.data = "1";//将a的data字段赋值为"1"
            F(ref a);//调用函数F,注意:这时将对象a的引用传给a1,不是赋值,相当与 给a对象的引用起了个别名
            Console.WriteLine(a.data);//这时a已经指向函数中新建的对象,因此值应为"3"
        }
    }
可以这么理解,没有ref时的引用对象的参数传递就相当于c++中的一般指针传递(函数声明相当于: void F(Type * v)),
而有ref时的引用对象的参数传递相当于c++中的一般指向指针的指针传递(函数声明相当于: void F(Type ** v)).
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值