今天逛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,證明沒傳出來。即地址未改變
希望有不同意見想法的朋友指出一下。。。。。。
![]() |
不含病毒。www.avast.com |