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)