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;
此时O与TWO是同个引用
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,证明没传出来。即地址未改变
希望有不同意见想法的朋友指出一下。。。。。。