C 中的 ref 傳進出的到底是什麼 解惑篇

2021-07-24 20:11:36 字數 1846 閱讀 5003

今天在瀏覽博文時,看到這篇文章:

c#中的ref 傳進出的到底是什麼 ? 在傳物件時使用ref的疑問

另附言:

本文寫於早上,就在想發布的那瞬間,靠,公司斷網了,原來修改的部分丟失了。

網一斷就是一天了,現在回到家才把之發布。

最近有人在看我 cyq.data 框架 的時候說起,既然class是引用位址,本身傳的就是位址,你**中還要寫ref傳遞來幹什麼;

原來以前明白的,被忽悠一下變不明白了,還以為自己原來的**寫錯了。

今天在幫人家解惑時,才把自己的惑給解了。

這裡我把上篇文章原問題的**小修改了一下

貼出來做示例:

//////

by 路過秋天 

///

class

program

static

void

change(person p)

static

void

change(person p, 

string

name)

static

void

change(

refperson p)}

這裡順便截圖讓大夥看看是怎麼除錯而解惑的。

f5執行:

1:我們執行到第一行**,斷點:

重點說明:

2:我們執行到change(p)內部中

簡單說:你這內部的p和外面的p都不一樣,所以不會影響外面p的位址。

備註p值的位址變化了,是因為斷點在第一行**時還沒執行例項化,所以其值是一樣的。

於是第一行結果輸出:張三

3:接下來執行到change(p,"李四") 函式內部

重點說明:這裡內部的p的位址還是發生了變化,變成了0x044becd0

然而其指向的值是一樣的,所以你把值改了,所以「李四」就出來了。

備註:內部的p和外面的p雖然不一樣,但是指向的值是一樣的

於是第一行結果輸出:李四

4:最後是 change(ref p) 函式內部

重點說明:

這裡內部的p位址和外部的p位址是一樣的,沒有發生變化

。然後重新指向乙個新的物件,只是物件的值位址發生了變化。

備註:外部p位址=內部p位址,所以其指向的值都是新的物件的值。

於是第三行結果輸出:張三

最終結果圖如下:

最後結言:

對於class型別使用 ref,是為了保持引用的位址是一致的。

所以,不要僅僅意識到引用型別傳位址,值型別傳值就了事了,要切切的注意到,引用型別傳址時,內部傳參會產生乙個新位址。

所以我們在傳遞類引用時,喜歡在內部使用 new的民工們得注意注意了。

這裡似乎也是傳參領域的問題,只是附上了 ref 。

C 中的 ref 傳進出的到底是什麼 解惑篇

今天在瀏覽博文時,看到這篇文章 c 中的ref 傳進出的到底是什麼 在傳物件時使用ref的疑問 另附言 本文寫於早上,就在想發布的那瞬間,靠,公司斷網了,原來修改的部分丟失了。網一斷就是一天了,現在回到家才把之發布。最近有人在看我 cyq.data 框架 的時候說起,既然class是引用位址,本身傳...

C 中的委託到底是什麼概念??

委託,簡單理解是這樣的.比如您要管您的孩子,把孩子送進了幼兒園.ok.此時您就把您的孩子委託給了幼兒園.當幼兒園放學,將孩子交還給您的手中.則是委託的 當然我這裡的例子是說非同步委託呼叫.您也可以同步.什麼是同步委託呼叫?您去銀行存錢.把錢給櫃員.他們幫你點鈔.存款然後給您存摺或卡.那麼您就相當於把...

Vue vue中的 attrs到底是什麼?

先來看看官方文件給的定義 包含了父作用域中不作為 prop 被識別 且獲取 的 attribute 繫結 class和style除外 當乙個元件沒有宣告任何 prop 時,這裡會包含所有父作用域的繫結 class和style除外 並且可以通過v bind attrs 傳入內部元件 在建立高階別的元件...