C#参数传递时到底发生了什么一(一般传递方式)

C#引用类型传递实例
本文通过两个示例详细解析了C#中引用类型按引用传递的机制,展示了方法调用前后对象状态的变化,以及在方法内部改变对象引用对原始对象的影响。

1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。

unsafe class Program
{
    static void Main(string[] args)
    {
        Employee myE = new Employee() { id=4};

        fixed (int* pId=&(myE.id))
        {
            Console.WriteLine("方法执行前,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);
        }
        testMethod(myE);
        fixed (int* pId = &(myE.id))
        {
            Console.WriteLine("方法执行后,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);
        }
        Console.ReadLine();
        
    }
    static void testMethod(Employee myE)
    {
        myE.id = 5;
        //myE = new Employee() { id = 5 };
        fixed (int* pId = &(myE.id))
        {
            Console.WriteLine("方法执行中,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);
        }
    }
}

输出为:

方法执行前,myE中id的地址为0x1AF5BE0,值为4
方法执行中,myE中id的地址为0x1AF5BE0,值为5
方法执行后,myE中id的地址为0x1AF5BE0,值为5

执行过程为:

1)  在堆中新建对象myE,在栈中建立指向myE的指针

2)  按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE

3)  方法结束后myE的修改被保留,新指针被抛弃(等待垃圾回收)

如下图所示:

2、 如果在方法内部将内存地址指向一个新对象,则方法结束后在方法中所作的修改会被丢弃(原指针仍指向原对象,方法参数指向新对象,结束后一起销毁)。

unsafe class Program
{
    static void Main(string[] args)
    {
        Employee myE = new Employee() { id=4};

        fixed (int* pId=&(myE.id))
        {
            Console.WriteLine("方法执行前,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);
        }
        testMethod(myE);
        fixed (int* pId = &(myE.id))
        {
            Console.WriteLine("方法执行后,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);
        }
        Console.ReadLine();
        
    }
    static void testMethod(Employee myE)
    {
        //myE.id = 5;
        myE = new Employee() { id = 5 };
        fixed (int* pId = &(myE.id))
        {
            Console.WriteLine("方法执行中,myE中id的地址为0x{0:X},值为{1}", (uint)&(*pId), (uint)*pId);
        }
    }
}

输出为:

方法执行前,myE中id的地址为0x1E77BE0,值为4
方法执行中,myE中id的地址为0x1E78E24,值为5
方法执行后,myE中id的地址为0x1E77BE0,值为4

执行过程为:

1)  在堆中新建对象myE,在栈中建立指向myE的指针

2)  按引用传递,所以在栈中新建指针,复制上面指针的地址,也指向myE

3)  方法中new一个新对象时,在堆中新建对象,并把地址传给指针2

4) 方法结束后新对象和新指针2均被抛弃,修改也同时抛弃(等待垃圾回收)

转载于:https://www.cnblogs.com/luyingxue/archive/2011/11/12/2246890.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值