深入理解c#函數(shù)的參數(shù)(值參數(shù)击罪,ref,out贪薪,params)

c#函數(shù)參數(shù)有四種類型媳禁,分別是:值參數(shù)、引用參數(shù)画切、輸出參數(shù)竣稽、參數(shù)數(shù)組

在了解函數(shù)的參數(shù)之前,我們先來(lái)了解什么是實(shí)參和形參霍弹。

什么是形參毫别?

????????形參是聲明在方法的參數(shù)列表中,他可以是不同類型的典格,中間用逗號(hào)隔開(kāi)


什么是實(shí)參岛宦?

? ? ? ? 當(dāng)調(diào)用一個(gè)方法時(shí),用于初始化形參的表達(dá)式或變量成為實(shí)參钝计,他放在方法調(diào)用的參數(shù)列表中(注:他可以是表達(dá)式)


調(diào)用方法時(shí)恋博,必須滿足以下要求:

? ??????● 實(shí)參的數(shù)目必須和形參數(shù)目相同(參數(shù)數(shù)組除外)

? ??????●每個(gè)實(shí)參必須和相應(yīng)的形參類型匹配

1.值參數(shù)

什么是值參數(shù)?

? ? ? ? 通俗的講私恬,沒(méi)有用到ref,out炼吴,param等修飾符本鸣,形式是類型+參數(shù)名的參數(shù)。

? ? ? ? ?書(shū)上解釋:有幾種參數(shù)硅蹦,他們使用稍微不同的方法從方法傳入或傳出數(shù)據(jù)荣德。你到現(xiàn)在一直看到的這種類型是默認(rèn)的類型闷煤,成為值參數(shù)

特點(diǎn):

? ? ? ? 使用值參數(shù),數(shù)據(jù)通過(guò)復(fù)制到實(shí)參的值到形參的方式傳遞到方法涮瞻。方法被調(diào)用時(shí)鲤拿,系統(tǒng)做如下操作:

? ??????● 在棧中為形參分配空間。

? ??????● 復(fù)制實(shí)參到形參

下面來(lái)看這樣一個(gè)實(shí)例


問(wèn)題:為什么在MyFunc方法之f1和f2同樣加了5署咽,但是a1的val值變了近顷,a2的值卻沒(méi)有變?


我們通過(guò)堆棧來(lái)分析:

? ? ? ? 1.在方法被調(diào)用前宁否,用作實(shí)參的變量a1和a2都已經(jīng)在棧里了窒升。

? ? ? ? 2.隨著方法的開(kāi)始,系統(tǒng)在棧中為形參分配空間慕匠,并把實(shí)參的值復(fù)制給形參饱须。

? ??????????????● 因?yàn)閍1是引用類型的,所以引用被復(fù)制台谊,所以實(shí)參和形參都引用堆中的唯一對(duì)象(f1和a1)蓉媳。

? ??????????????● 因?yàn)閍2是值類型的,所以值被復(fù)制锅铅,產(chǎn)生了一個(gè)獨(dú)立的數(shù)據(jù)督怜。

? ? ? ? ?3.在方法的結(jié)尾,f2和對(duì)象f1的字段都被加上了5狠角。

? ? ? ? ?4.方法執(zhí)行后号杠,形參從棧中彈出。

? ??????????????●a2丰歌,值類型姨蟋,他的值沒(méi)有受方法的影響。

? ??????????????●a1立帖,引用類型眼溶,因?yàn)樗托螀1指向同一塊地址,所以隨著f1改變晓勇,他的值一? ? ? ? ? ????????????????塊跟著改變了堂飞。

2.引用參數(shù)ref

什么是引用參數(shù)?

? ? ? ? 通俗的講绑咱,在參數(shù)類型前加上ref修飾符的參數(shù)

特點(diǎn):

? ??????● 必須在方法聲明和調(diào)用中都使用ref修飾符

? ? ? ??● 實(shí)參必須是變量绰筛,在用作實(shí)參前必須被賦值,否則會(huì)報(bào)錯(cuò)描融,如果是引用類型變量铝噩,可以賦值為一個(gè)應(yīng)用或者null

? ??????● 和值參數(shù)不同,不在棧中為形參分配新的內(nèi)存

? ? ? ??●形參的名稱相當(dāng)于實(shí)參變量的別名窿克,引用于實(shí)參相同的內(nèi)存位置


下面來(lái)看這樣一個(gè)實(shí)例


問(wèn)題:為什么這次a1和a2的值最終改變了骏庸?

同樣的毛甲,我們通過(guò)堆棧來(lái)分析


1.在方法調(diào)用之前,實(shí)參變量a1和a2都已經(jīng)在棧里了

2. 在方法開(kāi)始之前具被。形參名被設(shè)置為實(shí)參的別名玻募。變量a1和f1都指向了堆中相同的內(nèi)存地址,f2和a2都使用了棧中同一塊內(nèi)存

3.在方法結(jié)束位置一姿,f2和f1都加上了5

4.方法結(jié)束后七咧,形參的名稱已經(jīng)失效,但是a2的值和a1指向的對(duì)象的值都在方法內(nèi)部被改變了啸蜜。a2是值類型的變量坑雅,a1是引用類型

3.輸出參數(shù)out

什么是輸出參數(shù)?

? ? ? ? 通俗的講衬横,在參數(shù)面前加上out修飾符的參數(shù)

? ? ? ? 輸出參數(shù)用于從方法體內(nèi)吧數(shù)據(jù)傳出到調(diào)用代碼裹粤。

特點(diǎn):

? ??????● 必須在聲明的調(diào)用中都使用out修飾符

? ??????● 實(shí)參必須是變量,而不能是其他表達(dá)式

? ??????● 形參相當(dāng)于實(shí)參的別名蜂林,形參和實(shí)參都是統(tǒng)一內(nèi)存位置的名稱
? ? ? ??

與ref參數(shù)的不同點(diǎn)

? ??????● 在方法內(nèi)部遥诉,輸入?yún)?shù)在被讀取之前必須被賦值。這意味著與參數(shù)的初始值是無(wú)關(guān)的噪叙,所以沒(méi)有必要在方法調(diào)用之前為實(shí)參賦值矮锈。

? ??????● 每個(gè)輸出參數(shù)在方法返回之前必須被賦值,否則會(huì)被報(bào)錯(cuò)


下面來(lái)看這樣一個(gè)示例


可以看到睁蕾,和引用參數(shù)一樣苞笨,a1 a2的值最后都變了

我們通過(guò)堆棧來(lái)分析


1. 在方法調(diào)用之前,將要被用作實(shí)參的變量a1和a2都已經(jīng)在棧里了子眶。

2.在方法的開(kāi)始瀑凝,形參名被設(shè)置為實(shí)參的別名,變量a1和f1都指向了堆中相同的內(nèi)存地? ? ? 址臭杰,f2和a2都使用了棧中同一塊內(nèi)存

3.在方法內(nèi)部粤咪,創(chuàng)建了一個(gè)MyClass類型的對(duì)象并把它賦值給f1,然后賦一個(gè)值給f1的字段渴杆,也賦一個(gè)值給f2寥枝。對(duì)f1和f1賦值時(shí)必須的,因?yàn)樗麄兪禽敵鰠?shù)

4.方法結(jié)束后磁奖,形參的名稱已經(jīng)失效囊拜,但是a2的值和a1指向的對(duì)象的值都在方法內(nèi)部被改變了。

4.參數(shù)數(shù)組params

什么是參數(shù)數(shù)組点寥?

????????簡(jiǎn)單的說(shuō)就是 params + 參數(shù)類型 + [ ] + 參數(shù)名? ? ? 的參數(shù)形式艾疟,它允許多個(gè)或者0個(gè)實(shí)參對(duì)應(yīng)一個(gè)特殊的形參。

特點(diǎn):

? ??????● 在一個(gè)參數(shù)列表中只能有一個(gè)參數(shù)數(shù)組敢辩。

? ??????● 如果有蔽莱,他必須是列表中的最后一個(gè)。

? ??????● 在數(shù)據(jù)類型前面用params修飾符

? ??????● 在數(shù)據(jù)類型后放置一組空的方括號(hào)

? ??????● 實(shí)參可以為0

如何調(diào)用戚长?

? ??????● 用一個(gè)逗號(hào)分割該數(shù)據(jù)類型元素的列表盗冷。所有元素必須是方法聲明中指定的類型。

? ??????● 一個(gè)該數(shù)據(jù)類型元素的一維數(shù)組


1.數(shù)組分離作實(shí)參


? 可以看到雖然在方法內(nèi)部修改了參數(shù)的值同廉,但是打印出來(lái)實(shí)參的值并沒(méi)有改變

用堆棧解釋


? ??????● 在方法調(diào)用之前仪糖,三個(gè)實(shí)參就已經(jīng)在棧里

? ? ? ??● 在方法開(kāi)始的時(shí)候,在棧中新加入形參inVals迫肖,三個(gè)實(shí)參被用于初始化堆中的數(shù)組锅劝,在并且數(shù)組的引用被賦值給形參inVals

? ??????● 在方法內(nèi)部,代碼首先檢查以確認(rèn)數(shù)組醫(yī)用不是null蟆湖,然后處理數(shù)組故爵,把每個(gè)元素乘10并保存回去

? ??????● 方法執(zhí)行之后,形參invals失效

注意:

? ? ? ??● 如果數(shù)組參數(shù)是值類型隅津,那么值被復(fù)制诬垂,實(shí)參不收方法內(nèi)部的影響

? ??????● 如果數(shù)組參數(shù)是引用類型,那么引用被復(fù)制伦仍,實(shí)參引用的對(duì)象可以受到方法內(nèi)部的影響


2.數(shù)組作實(shí)參

? ? ? ? 把單一的數(shù)組變量作為實(shí)參傳遞结窘,這種情況下,編譯器使用你的數(shù)組而不是重新創(chuàng)建一個(gè)


參數(shù)類型總結(jié)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末充蓝,一起剝皮案震驚了整個(gè)濱河市隧枫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓苟,老刑警劉巖官脓,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異娜谊,居然都是意外死亡确买,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)纱皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)湾趾,“玉大人,你說(shuō)我怎么就攤上這事派草〔蟛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵近迁,是天一觀的道長(zhǎng)艺普。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么歧譬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任岸浑,我火速辦了婚禮,結(jié)果婚禮上瑰步,老公的妹妹穿的比我還像新娘矢洲。我一直安慰自己,他們只是感情好缩焦,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布读虏。 她就那樣靜靜地躺著,像睡著了一般袁滥。 火紅的嫁衣襯著肌膚如雪盖桥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天题翻,我揣著相機(jī)與錄音揩徊,去河邊找鬼。 笑死藐握,一個(gè)胖子當(dāng)著我的面吹牛靴拱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猾普,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袜炕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了初家?” 一聲冷哼從身側(cè)響起偎窘,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溜在,沒(méi)想到半個(gè)月后陌知,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掖肋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年仆葡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片志笼。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沿盅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纫溃,到底是詐尸還是另有隱情腰涧,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布紊浩,位于F島的核電站窖铡,受9級(jí)特大地震影響疗锐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜费彼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一滑臊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敌买,春花似錦简珠、人聲如沸阶界。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膘融。三九已至芙粱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氧映,已是汗流浹背春畔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岛都,地道東北人律姨。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像臼疫,于是被迫代替她去往敵國(guó)和親择份。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361