在c#

时间:2018-06-01 11:11:04

标签: c# .net reference

通过引用调用对象时,什么会被压入堆栈?请考虑以下代码:

using System;
class em
{
   public int i=0;
}
class program
{
    public void method(int a, ref int b, em c, ref em d)
    {
         //implementation
    }
    static public void Main()
    {
         int i;
         int j;
         em e1 = new em();
         em e2 = new em();
         i=9;
         j=10;
         Program p=new Program();
         p.method(i,ref j,e1,ref e2);
    }
}

当传递e1时,对象的引用作为参数传递但是 在这段代码中,当e2通过引用传递时,什么被推入堆栈,即什么作为参数传递给方法?使用ref。

返回相同对象时传递的内容

2 个答案:

答案 0 :(得分:1)

类是引用类型,当您将实例作为参数传递时,复制的对象的指针(引用)。但是当您使用ref关键字时,指针本身会被传递,并且任何更改都会直接在原始引用上完成。请参阅下面的代码:

class program
{
    static public void method(int a, ref int b, em c, ref em d)
    {
        c = null; // c is copy of e1
        d = null; // d is e2
    }
    static public void Main()
    {
        int i;
        int j;
        em e1 = new em(); // e1 is pointer to 'new em()' location at memory
        em e2 = new em(); // e2 is pointer to 'new em()' location at memory
        i = 9;
        j = 10;
        method(i, ref j, e1, ref e2);
        // e1 is intact
        // e2 is null
    }
}

答案 1 :(得分:0)

数据存在于堆上,因为e2不是值类型,因此只是对堆地址的引用存储在堆栈中。所以你没有传递e2,只是对e2的引用。

This是一个很好的链接,显示了值和引用类型之间的差异以及它们的存储位置。