winform 關於ref一點小想法

2022-03-05 18:45:25 字數 1957 閱讀 2380

今天逛

codeproject

時看到一種方法的寫法,嘿嘿,比較少見到,記一下。。。

class o

static void

change(ref o inputo)

都知道類是引用型別,如果是直接傳遞進去乙個物件的話,其實只是傳引用,

c++的說法就是乙個位址吧

,是會傳遞出來的。即:

static void

change(ref o inputo)

static void change(o

inputo)

o one = new o();

one.i = 10;

one.s =

"10";

change(one);

console.writeline(one.i);

console.writeline(one.s);

列印結果是

1110 change

o two = new o();

two.i = 110;

two.s =

"110";

change(ref two);

console.writeline(two.i);

console.writeline(two.s);

列印結果是

111110 change

這是再平常不過的了。。。可是是下面的情況呢,比較少見哦。。。或許是我看的**少吧

可當如果是

inputo = new o()

呢?做了一下,驗證了自已的想法

static void change(o

inputo)

static void change(

ref o inputo

)如上的列印結果是

1010

1change

「我的「

結論是當

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);

110110

1change

證明上面的位址改變並傳遞出來的結論是正確的

而如果沒有

ref時

o antherone = one;

change(one);

console.writeline(antherone.equals(one));

列印是true

,證明沒傳出來。即位址未改變

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

關於C C 記憶體一點小知識

這裡室友拷了一段 過來除錯,這個過程中發現了一點由使用了未分配的記憶體造成的乙個問題,為此我花了一點時間來除錯問題的根源 如下 include include using namespace std int main if flag else return 0 答 破解上述加密的關鍵在於利用攻破st...

關於uri的一點小疑惑

簡單的框架 在後台中的controller如此設定 system.out.println hello return hello 頁面hello.html中 this is a test hello view 當執行該專案預設顯示該頁面,http localhost 8080 testspring 此...

關於C CLI的一點小總結

最近在給c 動態庫包皮 知識是嚴肅的,莫笑,hia,hia,hia 給c 的人用。扒了別人的部落格,節選一點貼出來,忘了從 扒的了,後期慢慢補,先厚顏定為原創吧。宣告,總結的部分不是原創。總結 有c 及c 背景的人使用c cli的必備知識 1,c cli裡的new等於c 裡的new,gcnew等於c...