2009-02-19 242 views
2

我需要知道如何以及在哪裏使用c#中的斷言的例子。你在c#代碼中如何以及在哪裏使用斷言?

編輯我需要使用斷言最適合的地方的實際例子。這就是爲什麼我需要從那些誰使用它們的示例

+0

你能上,爲什麼你需要知道這一點解釋一下?這將有助於解釋這些例子。 – 2009-02-19 14:22:17

回答

0

最直接的答案,我能想到的是,當你測試代碼:

Assert.IsNotNull(yourVariable); 

您還可以使用Debug.Assert的

System.Diagnostics.Debug.Assert(myBooleanProperty); 
0

我更喜歡使用單元測試來充實問題。由於我的主要產品是庫/程序集,因此還必須確保參數經過驗證並引發適當的異常。

有趣的消息:Debug.Assert()被髮布版本中的MS C#編譯器捕獲並刪除。

0

當然。

的外部單元測試,我可以識別3種錯誤(非常簡化)的:

  1. 重要的內部錯誤:東西,從你的代碼單元的內部,用戶有沒有辦法影響。
  2. 濫用的一些功能:例如給出一零代替一些值的
  3. 外部的問題:如不存在的文件,沒有網絡連接,等等

我認爲斷言應當僅施加到第一個。應該使用適當的例外來處理二號和三號。

1

我真的很喜歡使用Debug.Assert的(),甚至Debug.Fail(),以支持debugtime期間exceptionhandling:

if(!whatever_I_expect) 
{ 
    var message = "<exception message>"; 
    Debug.Fail(message); 
    throw new InvalidOperation(message); 
} 

這樣,我得到Debug.Assert的的非常方便的對話框(),並能在忽略,重試和中止之間進行選擇。重試將進入可開始調試的代碼。 特別是遞歸方法或複雜的try-catch構造可以通過這種方式更好地調試。你總是得到正確的調用堆棧。而在我的releasecode中,我仍然有一個有效的錯誤處理,沒有消息框。

0

我經常使用Debug.Assert來檢查我的代碼的先決條件。如果一個對象依賴於另一個對象存在,我可能會斷言這個其他對象不爲null。即使在我將程序交給測試之前,這也會使很多問題可見。

在我想用單元測試檢查的內容和我想在運行時用assertions檢查的內容之間有一條細線。通常,單元測試用於在應用程序的其餘部分處於良好定義的狀態(我廣泛使用mock對象)時測試單個代碼單元,並使用debug.assert在運行時檢查應用程序的狀態是否爲我期望。

0

有不同的看法(請參閱comp.lang.C++中最近的子線程,主題爲「我們不使用C++異常」)。

我認爲斷言是最好的檢查和記錄你知道不可能是錯誤的東西,除非實現不一致。這比前提條件和不變量更強。

E.g.只能從幾個不同的地方調用的幫助函數具有可用的資源。因爲這個幫助器是私有的,只能在一個類中使用,所以拋出一個ArgumentException並不合適(這是公共/受保護的接口)。

0

我在代碼中使用了很多的Debug.Assert(),它永遠不會收到一個錯誤/無效的參數 - 輸入參數和因變量應該已被驗證的代碼種類。真相是,我知道我會犯錯。我只是不知道在哪裏。 :-)司法使用「Debug.Assert」幫助我應對我的不完美之處。

下面是我自己的代碼示例:

public bool AddPoint(uint time, object value) 
    { 
     bool success = false; 
     int index = 0; 

     Debug.Assert(_selectedParameterName != null, "RecipeBusinessObject.InsertPointAtTime() _selectedParameterName = null"); 
     Debug.Assert(_currentRecipe != null, "RecipeBusinessObject.InsertPointAtTime() _currentRecipe = null");   
     Debug.Assert(CurrentParameterTable != null, "RecipeBusinessObject.InsertPointAtTime() CurrentParameterTable = null"); 

     Debug.Assert(index >= 0, "RecipeBusinessObject.InsertPoint(), index out of range, index = " + index.ToString()); 
     Debug.Assert(index <= CurrentParameterTable.Rows.Count, "RecipeBusinessObject.InsertPoint(), index out of range, index = " + index.ToString()); 

     DataRow newRow = CurrentParameterTable.NewRow(); 

     <snip> 
相關問題