close
文章出處

今天逛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,證明沒傳出來。即地址未改變

 


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


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()