通过引用调用对象时,什么会被压入堆栈?请考虑以下代码:
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。
返回相同对象时传递的内容答案 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是一个很好的链接,显示了值和引用类型之间的差异以及它们的存储位置。