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,证明没传出来。即地址未改变

 


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

posted @ 2008-12-11 15:42  yellowyu  阅读(716)  评论(0编辑  收藏  举报