C#回顧學習筆記二十五:程式設計師必備技能,除錯
首先應該清楚一點:程式碼都是從頭開始,一句一句往下執行。程式設計師在發現程式碼有問題時,首先要想到的就是,這個錯誤可能發生在第幾句程式碼。有經驗的程式設計師找錯誤的位置很準,對於沒有經驗的程式設計師來說,可以從第一句程式碼開始檢驗錯誤。那麼,如何檢驗錯誤?
一、普通的按一下F11執行。
平時執行程式按的F5,這樣程式會自動執行所有程式碼。但如果按F11執行,程式則只會執行一句。再次按下F11程式才會又往下執行一句。按F11叫逐句除錯。對於經驗不足的程式設計師來說,一句一句執行,並用滑鼠觀察變數的值是否屬於預期的值,是很適合入門的除錯姿勢。找錯誤實際上就是在除錯過程中用滑鼠去觀察每個變數或物件的值是否屬於預期的值,直到觀察到認為不應該出現的值,那麼就算找到了錯誤。
如上圖所示,在按F11鍵逐句除錯的過程中,可以看到當前程式執行情況下變數的詳細變化情況。“當前程式執行情況”指的是程式當前執行所在的位置,只有執行過的語句,才可以看到變數的值,而程式還沒執行的部分,是看不到任何結果的,因為程式都還沒有執行到那裡。
二、普通的按一下F10執行。
同上面F11,也是單步執行。不同的是在遇到呼叫的方法時,按F11會進入方法內執行,而按F10則只會跳過方法的執行過程,直接執行完這個方法。按F10鍵叫逐過程除錯。
三、斷點除錯
斷點除錯是最常見的除錯姿勢。經驗豐厚的程式設計師在發現程式有錯誤時,靠經驗就可以大概確定錯誤的位置,並在那裡設定好斷點,此時再按F5執行,程式會自動執行到斷點所在的程式碼並停在那裡,等待著程式設計師的繼續操作。斷點除錯就是給程式碼打上一個程式執行停止的標記,讓執行的程式在看到標記後就暫停執行。
現在從一個例項,來演示“初次執行測試-懷疑有錯-除錯錯誤-修改錯誤-再次執行測試”這個過程。比如有如下程式碼,預期得到一個數組內成員相加的和,經驗豐厚的程式設計師可能一下子就可以看出問題所在,但這裡只是簡單介紹除錯的過程,程式設計師腦袋都在想什麼。
第1步,寫出程式碼,初次執行測試。程式碼如下所示:
第2步,發現執行結果很奇怪,測試結果比預期結果還小很多,懷疑有錯。如下圖所示:class Program { static void Main(string[] args) { int[] nums = { 1, 3, 7, 12 }; int sum = 0;//統計和 for (int i = 0; i < nums.Length; i++) { sum = sum + nums[1]; } Console.WriteLine("陣列總和為{0}", sum); Console.ReadKey(); } }
第3步,除錯錯誤,期望找到錯誤。
①初步分析,在宣告陣列沒有問題,宣告變數sum用來統計總和也沒問題,那麼錯誤可能出現在for迴圈內,因此先在for迴圈位置打上斷點。如圖所示,在紅色箭頭標記處打上斷點:
②按F5執行,讓程式停在這裡。並多次按F11逐句除錯,讓程式停止在紅色箭頭標記的位置,這樣才能說明for迴圈內的語句已經被執行。程式停留的位置只是代表當前準備執行這一句,不是說已經執行過這一句,需要注意。如圖所示,按F11讓程式執行到這裡。
③分析sum = sum + nums[1];這一句,首次執行這一句時sum的值究竟是多少。將滑鼠放到變數sum上,可以觀察到當前sum值是多少。如圖所示,用滑鼠可以觀察到sum當前值為3:
④分析中:預期中sum第一次獲得的值應該是陣列第一個成員的值,但這裡卻是3,開始抱著懷疑的態度繼續按F11執行,之後第二次執行sum = sum + nums[1];後觀察發現,sum的值為6,因此懷疑是否每次迴圈都讓sum的值加3了,而3是陣列內第二個成員,陣列下標是nums[1],然後發現錯誤出在sum = sum + nums[1];這一句。因為用的是nums[1],這使得每次迴圈都增加3。因此應該改為nums[i],這樣每次迴圈才會依次加上nums[0]、nums[1]、nums[2]、nums[3]。
第4步,修改錯誤,將nums[1]改為nums[i];,如圖所示:
第5步,再次測試執行,感覺跟預期結果一樣,完成除錯過程。