不得不聊的關於方法的參數的那些事兒


  很多朋友在看了這個標題之后,可能會以不屑的眼神看着我說,"去,我xx年的編程經驗,難道方法(函數)還有什么不知道的么?你可要記住,從我開始學編程的那1天起就已經開始每天都在寫方法了."  當然我不會從最基本的說起,更多的我希望說說我自己的的理解以及原理,所以這篇文章僅僅是個人總結,可能會由於個人知識面比較窄的原因會存在一些瑕疵,請大家不吝指教.好了,那我們就開始吧.

     

 

 

  a. 為什么定義了形參,就一定要傳遞實參?

  誰都知道,如果1個方法定義了參數,那么我們在調用這個方法的時候,就必須要為這個方法的參數賦值.比如下面這樣.

           

   如果不傳遞的話,誰都知道這將是1個什么樣的后果.

    

   但是又有誰想過為什么是這樣的呢?為什么方法定義了參數,我們在調用的時候就必須要為其傳遞實參呢?反正之前我是沒有想過這個問題的,僅僅是這樣的1句話就將自己打發,"那是微軟規定的語法". 后來仔細想了一下,我認為之所以是這樣,是因為方法的參數本質上是這個方法的1個局部變量.所以我們可以在方法中直接使用這個參數,並且你也不能再這個方法中定義1個名字和參數的名字相同的變量.我們說將實參傳遞給形參實際上就是將實參的值賦值給形參的1個過程.而局部變量有1個最重要的特點就是使用之前必須賦值.但是我們在聲明這個參數的時候卻沒有為它賦值,僅僅是聲明了而已.所以如果調用者要執行這個方法中的代碼,而在這個方法中是有可能會用到這個參數的.所以要求調用者在調用方法的時候必須要為形參賦值.

  對於方法的參數的本質是方法的局部變量這1個說法,估計有童鞋會有意見.

    

    正如上面這段代碼.你會發現我們在這里可以直接使用參數,但是參數是沒有值的.這個時候是不會報錯的(使用了未賦值的局部變量).原因很簡單.因為方法中的代碼只有在方法被調用的時候才會執行,而這個方法如果被調用,那么調用者就必須要為參數傳值,所以當這個方法中的代碼運行起來以后,參數str中絕對肯定已經有值了.

  所以我們的結論是: 方法的參數本質上是這個方法的局部變量,而局部變量在使用之前必須要有值.而我們在聲明形參的時候沒有為形參賦值,所以要求調用者在調用的時候必須賦值,如果不賦值的話,在方法中使用到形參的時候會因為形參沒有被賦值而報錯.

  b.方法的參數的默認值.

  從上面我們可以知道,之所以一定要為形參傳遞參數是因為形參沒有值.那如果是因為這樣話我們可以不可以在聲明形參的同時就為這個形參賦1個默認值呢?答案當然是肯定的.原因嘛很簡單,剛才才說了 定義1個方法的參數其實就是聲明了1個方法的局部變量,那我當然可以在聲明這個局部變量的同時為這個局部變量賦值了.

    

    這個時候,我們發現我們在聲明方法的參數的同時為這個參數賦了1個默認值,那就意味着這個局部變量已經有值了,如果調用者希望執行這個方法中的代碼,大可不必一定要為這個方法的參數傳值.完全可以不傳值.方法仍然會執行,不會報錯.再一次證明了方法的參數的本質是這個方法的1個局部變量.

    當然了,如果我們在調用帶默認值的參數的方法的時候,不傳值的話,在方法的內部會直接使用其默認值.如果調用者希望這個值是自己指定的值,那么就只有選擇自己傳遞了.

   

  所以,我的總結是:如果方法的參數的值不一定要求調用者指定,就可以為這個參數指定默認值,調用者根據具體的情況來選擇傳遞還是不傳遞.如果調用者希望這個參數使用默認值那么就可以選擇不傳遞,如果不希望使用默認值而是調用者自己指定,就自己選擇為參數傳遞值.

  在為方法定義帶默認值的參數的時候必須要注意第1個問題.所有的帶默認值的參數必須出現在參數列表的最右側.換句話說,帶默認值的參數必須出現在參數列表的最后面.

   

   我們將帶默認值的參數放在參數列表的最右側,才可以滴.原因很簡單.我想不解釋了吧.因為編譯器不知道我們到底是要給那1個形參傳遞參數.

  關於方法的參數的默認值注意的第2個問題:參數的默認值必須是編譯時就可以確定的值.如果我們為參數的默認值賦值1個運行時才確定的變量的話,那么這個時候編譯器是會報語法錯誤的.

   

  第3個要注意的問題:ref/out修飾的參數不能有默認值,那關於這個的原因,我想應該不難理解.因為ref/out要求傳遞變量的地址,而不是變量的值,所以就算可以給值也是沒有任何實際意義的.

   

   第4個要注意的問題: params修飾的數組參數仍然需要放在參數列表的最后,而不是放在默認值參數的最前面.

     

   c. 顯示的為形參傳遞實參.

    正如我們前面所說,方法的參數可以有默認值,它的好處在於可以不給帶默認值的參數傳遞實參,但是很快我們發現1個困擾我們的問題了.

    

    看看上面這個方法,假如我們作為調用者只希望給形參str賦值,我們該如何傳參呢?我們試着這樣調用.

    

    我們卻發現,它將字符串"testString"傳遞給了形參name,原因很簡單嘛。我們知道在傳遞參數的時候,編譯器會按照順序將實參1個1個的賦值給形參,所以不奇怪的將實參"testString"賦值給了第3個形參.

    那到底該如何解決呢? 不急,先帶大家看1下我們經常看見的1個現象,但是很少去深究,起碼我之前是這樣的.當我們在調用1個方法的時候,並為這個方法的參數傳遞實參的時候,Visual Studio會做如下提示:

    

    這個時候VS自動提示的name:是個什么東西呢?以前也有朋友問過我這個問題,當時我支支吾吾半天沒說出個所以然.現在總算搞清楚了,這個其實就是方法的形參名.通過方法的形參名我們可以指定為那1個形參賦值,看下面的代碼吧.

   

   這個時候你會發現,程序運行的時候,不再是按照順序將實參的值賦值給形參了,而是根據我們指定的形參來賦值的了.這樣就可以解決我們之前的那個問題了.

   好了,今天就到這里了.對於一些大牛而言,可能這些東西早已知曉,本人在園子里發這篇博文也是希望給自己做1個小的總結.難免會有紕漏,請大家指點.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM