猿问

请教一下关于ref和out的问题?

代码如下:
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呢?请高手指教,我内存方面哪个地方分析错了?谢谢!

神不在的星期二
浏览 508回答 2
2回答

九州编程

ref /out 使用的场景差不多。但是也有不同。ref是传递内存地址。out虽然也是传递内存地址。但是在进入方法体后会有初始化的操作。void sum(out int intVal){  intVal=0;   int a=10;   intVal+=a;}如果调用传值 10 的话,intVal进入后必须初始化。而用ref的话,是20。保留了原来的值。

天涯尽头无女友

如果不带ref的话就是20,带了ref的话就是30.带了ref是传址的,所以new Person(30)时,实际已经改变了p1的引用.
随时随地看视频慕课网APP
我要回答