C# ref & out

1. What is ref & out ?

參數(shù)傳遞時(shí)按引用傳遞參數(shù)

2.Why need ref & out ?

按值傳遞是通過將實(shí)參的值Copy到形參,來(lái)實(shí)現(xiàn)將值傳遞到方法。CLR會(huì)1)給形參分配空間 2)將實(shí)參值復(fù)制到形參

//假設(shè)需要交換兩個(gè)數(shù)
void Swap(int a,int b){
 int temp = a;
 a = b;
 b = temp;
}
---------------------------
int a = 1;
int b = 2;
Swap(1,2);
結(jié)果a仍為1,b仍為2

因?yàn)閰?shù)傳遞時(shí)是默認(rèn)按值來(lái)傳遞的所以這樣并不能完成值得交換。Swap方法在內(nèi)部操作得并不是a,b變量本身,而是它得克隆,而當(dāng)我們需要變量在方法執(zhí)行以后也做了相應(yīng)改變時(shí),我們就需要按引用傳遞參數(shù)的方式,于是就需要ref 和 out 這種可以使變量按引用傳遞地關(guān)鍵字。

此外,由于按引用傳遞的參數(shù),CLR將不再為形參分配新內(nèi)存,形參相當(dāng)于實(shí)參的一個(gè)別名,它們指向同一個(gè)內(nèi)存地址空間,節(jié)省內(nèi)存且效率更高。

3.How to understand 引用類型 & 值類型?

假設(shè)我有一個(gè)很漂亮地風(fēng)箏,然后你想要風(fēng)箏,這時(shí)候我不是給你買一個(gè)和我一模一樣的風(fēng)箏,而是把我風(fēng)箏的線交給你,至于你怎么處置這個(gè)風(fēng)箏全看你自己。你所做得每一個(gè)動(dòng)作都將直接作用于風(fēng)箏本身,而不是作用于和它一模一樣的副本。

值類型就相當(dāng)于買的一個(gè)和我一模一樣的風(fēng)箏,引用類型就相當(dāng)于是我的風(fēng)箏的線

4.what the same thing for ref & out ?

out & ref 都是按引用傳遞的,作用后都將改變?cè)瓉?lái)參數(shù)的數(shù)值。

int a = 1;
int b = 2;
Swap(ref a, ref b) // a = 2, b = 1

5.what the difference between ref & out ?

  • ref 有進(jìn)有出 參數(shù)傳入前必須初始化否則報(bào)語(yǔ)法錯(cuò)誤,傳入?yún)?shù)在函數(shù)內(nèi)部不會(huì)重新初始化可以直接使用。ref 多用于操作某個(gè)后續(xù)仍需繼續(xù)使用的變量場(chǎng)景
  • out 只進(jìn)不出 參數(shù)傳入前可以不初始化,但是傳入后在函數(shù)內(nèi)部必須先重新初始化后再使用,所以不管參數(shù)傳入前的值是多少,傳入函數(shù)后都會(huì)被初始化賦值后返回。out 多用于返回多個(gè)返回值的場(chǎng)景(如bool int.tryParse(string, out i)同時(shí)返回bool 和 i)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容