winform:关于ref一点小想法

今天逛CODEPROJECT时看到一种方法的写法,嘿嘿,比较少见到,记一下。。。

class o

{

public int i = 0;

public string s = string.Empty;

}

static void Change(ref o inputo)

{

inputo = new o();

inputo.i = inputo.i + 1;

inputo.s = inputo.s + " " + "change";

}

 

都知道类是引用类型,如果是直接传递进去一个对象的话,其实只是传引用,C++的说法就是一个地址吧,是会传递出来的。即:

static void Change(ref o inputo)

{

inputo.i = inputo.i + 1;

inputo.s = inputo.s + " " + "change";

}

static void Change(o inputo)

{

inputo.i = inputo.i + 1;

inputo.s = inputo.s + " " + "change";

}

 

o one = new o();

one.i = 10;

one.s = "10";

 

Change(one);

Console.WriteLine(one.i);

Console.WriteLine(one.s);

 

打印结果是

11

10 change

 

o two = new o();

two.i = 110;

two.s = "110";

Change(ref two);

Console.WriteLine(two.i);

Console.WriteLine(two.s);

打印结果是

111

110 change

这是再平常不过的了。。。可是是下面的情况呢,比较少见哦。。。或许是我看的代码少吧

可当如果是 inputo = new o()呢?

做了一下,验证了自已的想法

 

static void Change(o inputo)

{

inputo = new o();

inputo.i = inputo.i + 1;

inputo.s = inputo.s + " " + "change";

}

static void Change(ref o inputo)

{

inputo = new o();

inputo.i = inputo.i + 1;

inputo.s = inputo.s + " " + "change";

}

如上的打印结果是

10

10

1

 Change

“我的“结论是

 inputo = new o();即重新NEW时而无采用REF时,值改变是无法传出来的。而当采用REF时,值改变是可以传出来的

为什么呢?

自已的想法是这样的:因为是对象,所以都是以引用的方式传递,当方法里没有NEW时,改变的值是可以传出的,因为访问的都是同个引用了,也即是同个地址

而当方法里NEW了这个形参时,其实已经重新分配了一个空间,要相应的地址已改变,而方法外面访问的还是原来的地址,所以是没改变

而当NEW了这个形参,并且该形参是以REF传递进来时,相应的地址改变后通过REF把地址传递了出去。

所以此时外面的two地址已改变,

真是这样吗?

我们大可以继续这样做:

  o anthertwo = two;

此时OTWO是同个引用

  Change(ref two);

此时two的地址已改变,而anthertwo 的地址还是原来的

打印结果

Console.WriteLine(anthertwo .i);

Console.WriteLine(anthertwo .s);

           

 

Console.WriteLine(two.i);

Console.WriteLine(two.s);

 

110

110

1

 change

 

证明上面的地址改变并传递出来的结论是正确的

 

而如果没有REF

o antherone = one;

Change(one);

Console.WriteLine(antherone.Equals(one));

打印是TRUE,证明没传出来。即地址未改变

 


希望有不同意见想法的朋友指出一下。。。。。。 

转载于:https://www.cnblogs.com/yellowyu/archive/2008/12/11/1352978.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值