今天逛
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...