一晃大學四年要過去了,期間亂點了很多技能點, 導致每一項技能都只是處於入門階段。為了將C#作為我的主要技能,准備惡補相關姿勢(知識),通過各種技術論壇的推薦,找到了《C#圖解教程》這本書。初一看,感覺只不過都只是把知識羅列了出來而已,而且很多都是已知的,但是看到后面,發現它把很多以前模糊不清的知識變得清晰了,而且還學到了以前都沒有學到的新知識。特別結合圖片的解釋,讓初學者更加容易理解。
不多說,這次想將本書第五章方法有關參數相關知識進行梳理。
1、參數知識點
參數類型有值參數、引用參數、輸出參數、參數數組這么四種。上面的都是位置參數,另外C#還提供了命名參數和可選參數(和python極其類似)。
2、值參數
使用值參數,通過將實參的值復制到形參的方式把數據傳遞給方法。方法調用的時候,做了如下的操作:
1、在棧中為形參分配空間
2、講實參的值復制給形參
我們來舉一個例子,看代碼:
結果如下:
好了,我們用圖解的形式來解釋下,它是如何在堆棧中執行的:
一句話說:如果方法內部對參數做了賦值操作(引用類型內部成員賦值),跳出方法后,值類型參數還是不變,引用類型參數值會發生改變。
3、引用參數
使用引用參數,需要這兩點:
1、必須在方法的聲明和調用中都使用def修飾符;
2、實參必須是變量,在用作實參之前必須被賦值。如果是引用類型變量,可以賦值一個引用或null。
對於值參數而言,系統會在棧上為形參分配內存。而引用參數會具有以下這兩個特點:
1、不會為形參在棧上分配內存空間;
2、形參的參數名將作為實參的別名,指向相同的內存位置。
我們來舉一個例子,看代碼:
結果如下:
好了,我們用圖解的形式來解釋下,它是如何在堆棧中執行的:
一句話說:如果方法內部對參數做了賦值操作,跳出方法后,值類型參數和引用類型參數值都會發生改變。
3、引用類型作為值參數和引用參數
之前看到兩個例子,引用類型作為值參數和引用參數結果都會發生改變。但是要注意一點的是,他們改變的都是引用類型內部成員的值。
現在我們來看看,如果對引用類型本身賦值一個新對象會發生什么。我想通過上面兩幅圖應該也很容易知道了。
下面代碼展示引用類型作為值參數傳遞:
結果如下:
好了,我們用圖解的形式來解釋下,它是如何在堆棧中執行的:
下面代碼展示引用類型作為引用參數傳遞(只加了ref):
結果如下:
好了,我們用圖解的形式來解釋下,它是如何在堆棧中執行的:
總結:本質來說值參數實際就將實參在棧上復制了一份給形參,方法內部對形參做操作,執行方法后,會在棧上自動銷毀,而實參不受影響。而引用參數則是相當於實參的別名,方法內部對實參做操作,執行方法后,實參受影響。