很多朋友在看了這個標題之後,可能會以不屑的眼神看著我說,"去,我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個形參.
這個時候vs自動提示的name:是個什麼東西呢?以前也有朋友問過我這個問題,當時我支支吾吾半天沒說出個所以然.現在總算搞清楚了,這個其實就是方法的形參名.通過方法的形參名我們可以指定為那1個形參賦值,看下面的**吧.
這個時候你會發現,程式執行的時候,不再是按照順序將實參的值賦值給形參了,而是根據我們指定的形參來賦值的了.這樣就可以解決我們之前的那個問題了.
好了,今天就到這裡了.對於一些大牛而言,可能這些東西早已知曉,本人在園子裡發這篇博文也是希望給自己做1個小的總結.難免會有紕漏,請大家指點.
關於簡歷不得不說的那些事兒
最近手頭的事情不是很趕,突然有種想出去實習的衝動。最近看了一些大神的分享簡歷的製作,所以一直在準備著做乙份簡歷。1.簡歷格式 電子簡歷最好是pdf 2.簡歷名稱 簡歷名稱最好與主題格式保持一致,盡量避免 的簡歷 3.簡歷內容 簡歷內容最好是自己實力的百分之120左右 4.關於專案的描述 簡歷中關於專...
那些你不得不用的好外掛程式!
本期我們就功能開發再給大家推薦幾個非常省心的工具,侑虎君親測有效!效能非常高效。如下圖,在紅公尺2只要1.16ms即可完成整個函式的呼叫,非常快速。雖然該外掛程式目前僅支援ogg和o 格式,但是我們可以通過工具把其他格式轉換成o 格式匯入unity使用。為了增加角色運動的真實代入感,我們常常需要某些...
關於簡歷,那些你不得不知道的要點!!
突出重點 乙個招聘者希望看到你對自己的事業採取的是認真負責的態度。不要忘記雇主在尋找的是適合某特定職位的人,這個人將是數百應聘者中最合適的一人。推銷自己 最成功的廣告則要有簡短而富有感召力,並且能夠多次重複重要的資訊。簡歷應該限制在一頁紙以內,在頁面上端寫一段總結性的語言,陳述你在求職上最大的優勢,...