关于引用类型用ref传参的问题

           引用类型传参的时候传递的是对象的引用,引用变量是存在线程栈上的,变量的值是 GC堆里的对象的地址

所以引用变量加ref传参的时候,传递的不是GC堆上变量的地址(也就是引用变量的值),而是引用变量的地址(也就是变量在线程栈上的地址)

例子:

 

using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            test.Name="Begin";
            Trans(test);
            Console.WriteLine(test.Name);
        }
       public static void Trans(Test test)
        {
            Test t = new Test();
            t.Name = "End";
            test = t;
        }
    }
    public class Test
    {
        public string Name = "Hello";
    }
}

 

未用ref传参,输出结果是Begin,不提。

若使用ref传参,输出结果是End,使用ref传参的时候 传递的是test变量在线程栈上的地址,而不是test的值(GC堆上变量的地址),在Trans方法里面new了一个新Test对象,把对象在GC对上的地址 存到引用变量t里面。test=t,让test指向t所指向的新对象(这个对象的Name=“End”),方法调用完毕,回到主函数,这时test所指向的对象已经不是以前的对象了,而是在方法Trans里面new的对象。

 

 

如果没有用ref或out关键字的话,在给方法传递参数时,会有一个复制的过程,传递的是拷贝而不是数据本身,不管是值类型还是引用类型。
当然,用上了ref的话,就没有了这个复制过程,Main方法中的引用变量和方法中的引用变量就是实实在在的同一个引用了。

转载于:https://www.cnblogs.com/Jonas/archive/2009/04/24/1443137.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值