代码如下:
int i = 0;
Test(out i);
void Test(out j)
{
j = 4;
}
调用Test()方法时,变量i是不是会发生装箱操作呢,然后i和j同时指向相同的堆内存地址,是这样吗?参数用ref修饰时,也跟out一样会装箱吗?
在看看下面一个问题:
我首先自定义了一个Person类
public class Person
{
public int age;
public Person() { }
public Person(int age)
{
this.age = age;
}
}
public class Test
{
public static void Main()
{
Person p1 = new Person();
p1.age = 20;
Change(ref p1);
Console.Write(p1.age);
Console.ReadLine();
}
static void Change(ref Person p2)
{
p2 = new Person(30);
}
}
这段结果的输出结果为30,我有个疑问,在还未执行p2 = new Person(30)之前,我知道p1和p2同时指向一块堆内存,但当执行p2 = new Person(30)后,p2从新指向了新分配的内存,而p1还是指向原来的,如果按我这种思路的话,输出结果应该为20,怎么会是30呢?请高手指教,我内存方面哪个地方分析错了?谢谢!
ref /out 使用的场景差不多。但是也有不同。ref是传递内存地址。out虽然也是传递内存地址。但是在进入方法体后会有初始化的操作。
void sum(out int intVal){ intVal=0;
int a=10;
intVal+=a;
}
如果调用传值 10 的话,intVal进入后必须初始化。
而用ref的话,是20。保留了原来的值。
很久很久以前我学VB的时候,老师教我们形参和实参。。。之后就没了 呵呵
如果不带ref的话就是20,带了ref的话就是30.带了ref是传址的,所以new Person(30)时,实际已经改变了p1的引用.
static void Change(ref Person p2)
{
p2 = new Person(30);
}
这里的p2指向的就是p1,而你这边写了 new Person(30);,相当于p1=new Persion(30);
所以就是更改了P1,所以是30
你用了 ref 来指定参数,Change 方法传入的是p2指针,当 p2 = new Person(30); 后,p2(函数外为p1) 的指针地址发生了变化,指向了30那个位置,所以为30.
如果你 Change 方式是
static void Change(Person p2)
则输出仍然是20. 因为这是传入的是 p1 的指针的拷贝而不是指针本身,所以虽然其拷贝的指针p2地址指向了30那个位置,函数外那个p1 的指针地址却没有变。