程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> C#程序中Bug的快速修復方法

C#程序中Bug的快速修復方法

編輯:C#基礎知識

  本文將為大家介紹一下如何對C#程序Bug修復的快速方法。.NET Framework中包含許多工具可以用來更快、更容易地編寫正確的程序。但我們得面臨這樣的情況:出現bugs。不管程序多麼簡單,程序員都可能出錯。

  根據我的經驗,大多數程序的bugs出現在程序員之間的接口:當一個程序員編寫的代碼被另一個程序員調用時。不知何故,調用者破壞了代碼編寫時做的假設。是誰的過錯呢?這並不要緊,更重要的是你能多快修好它?下面這些技巧將幫你在程序投入使用前更快地發現並解決這些問題。最終,這些技巧會幫你診斷任何的確在使用中出現的問題。

  測試假設條件

  測試假設條件是構建正確的程序最重要的一個方法。在你寫一個函數時,你應該考慮並確定你對那個函數做了什麼樣的假設。你應該問自己以下這些問題:

  1. 當這個函數被調用時,這個對象必須是怎樣的(對象初試化,某個內在變量值)?

  2. 當這個函數存在時,這個對象將會怎樣(仍是#1,但包括該函數的副作用)?

  3. 該函數的任何參數必須是怎樣的(允許空值嗎,輸入值的范圍是什麼)?

  4. 返回值必須是怎樣的?

  一旦你問了自己這四個問題並作出回答後,把答案放到代碼中。

  在C#中,用System.Diagnostics.Debug類的Assent方法來表示:

以下是引用片段:
public bool ProcessIterations (int numIters)
  {
  Debug.Assert (numIters > 0,
  "ProcessIterations.",
  "Iterations must be more than 0");
  // More code...

  該代碼片段執行了numiters參數必須大於零這樣一個假設。如果你用一個無效的參數調用processiterations,該assert被觸發。這時候,程序停止運行並通知用戶出現的錯誤。聲明(assertions)只被編譯到debug 版本中的程序,所以它們不影響生產情況中的性能。

  為什麼用這種方法? 運用這種技巧可以確保很快地發現對你的類的方法未預料地使用。然後,或者調用者修改他的代碼,或者要求在你的類的行為(behavior)中修改。

  驗證完整性

  一個C# 程序中的大多數函數都是一個對象上的實例方法。對任何對象的有效狀態都有暗示的假設。當一個公有的方法被調用時,你應該確保那些暗示的假設經過了測試。C# 的條件編譯特征使這一點很容易實現。

  首先,寫一個私用的函數來測試對象的完整性。你在這麼做時,將該方法標為“conditional”: [Conditional ("DEBUG")]

以下是引用片段:
  private void ImOK ()
  {
  Debug.Assert (this != null,
  "Testing Object State",
  "this cannot be null");
  // More here.
  }

  然後,在每個公有的方法中,調用ImOK方法:

以下是引用片段:
public bool ProcessIterations (int numIters)
  {
  ImOK ();
  Debug.Assert (numIters > 0,
  "ProcessIterations.",
  "Iterations must be more than 0");}

  在發布(Release)版本中,編譯器自動取消對ImOK 的調用。

  為什麼用這種方法?運用該技巧,你可以快速發現任何你的對象狀態變得無效的情況。

  運用debug 和Trace 輸出

  打印診斷消息可以幫你確定你的程序是怎麼出錯的。你需要知道當觸發一個Assert時,發生了什麼情況;你也通常需要知道在這之前發生了什麼。知道這些的最好的方式就是運用你的代碼,這樣你就可以很容易地看到在出現bug前,調用了什麼函數。

  在生成調試輸出時,.net Framework有一些新的功能可以用。System.Diagnostic.Debug類可以讓你格式化調試輸出,並能很容易地創建不同的類或級別的調試輸出。下面是我喜歡用的一些指導方針。

  首先,在你的程序中為每個類建一個traceswitch對象:

以下是引用片段:
public class MyClass
  {
  private static TraceSwitch
  myClassSwitch = new TraceSwitch
  ("MyClassSwitch", "Controls the \
  debug output of MyClass");}

  然後,用WriteIf() 和 WriteLineIf() 方法來記錄任何你覺得有助於你跟蹤你的程序的信息:

  • 首頁
  • 上一頁
  • 1
  • 2
  • 3
  • 下一頁
  • 尾頁
  • 共3頁
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved