为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

神不在的星期二 2018-09-18 04:05:27
代码如下: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呢?请高手指教,我内存方面哪个地方分析错了?谢谢!
查看完整描述

2 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

ref /out 使用的场景差不多。但是也有不同。ref是传递内存地址。out虽然也是传递内存地址。但是在进入方法体后会有初始化的操作。

void sum(out int intVal)

{  intVal=0;
  int a=10;
  intVal+=a;
}

如果调用传值 10 的话,intVal进入后必须初始化。

而用ref的话,是20。保留了原来的值。


查看完整回答
反对 回复 2018-09-25
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

如果不带ref的话就是20,带了ref的话就是30.带了ref是传址的,所以new Person(30)时,实际已经改变了p1的引用.

查看完整回答
反对 回复 2018-09-25
  • 2 回答
  • 0 关注
  • 507 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信