2011-06-09 18 views
13

私はがアサートしている本を読んでいます(punが意図しています) "常に真または偽の条件がある場合はいつでも、Debug.Assertメソッドでコードをロードする必要があります。Debug.AssertとDebug.Failを自由に使用する必要がありますか?プロダクションコードのままにする必要がありますか?

私はこれらの2つのデバッグ方法を使用していませんが、意味があります。しかし、私の生産コードベース全体にこのようなものが散在しているのは嫌です。

思考?

答えて

32

コンパイラがリリースビルドで省略しているので問題ありません。それは悪い習慣ではなく、ソースからそれらを削除する必要はありません(実際にはそうしてはいけません)。しかし、あなたはは注意する必要があります:

Debug.Assert(SomethingImportantThatMustExecute()); 

がある悪いからSomethingImportantThatMustExecuteがリリースでは無視されます。

bool result = SomethingImportantThatMustExecute() 
Debug.Assert(result); 

基本的に、条件付きメソッドと部分メソッドの呼び出しで副作用は避けてください。

3

リリースビルド(Visual Studioプロジェクト設定を使用)をコンパイルすると、すべてDebug.Assertステートメントが自動的に削除されます。そう、そう、彼らを自由に使ってください。

+0

私はそれがそれらを削除することを知っています(それはすべての記号を削除します)が、それは醜いか悪い練習かどうか疑問に思います。私はそれがあなたの答えからだと思います。 – richard

+2

@Richard DesLonde:いいえ、実際には、良いコードを開発するのに役立ちます。 –

2

生産コードベースでDebug.Assertを自由に使用できます。 Debug.AssertConditionalAttributeで飾られています。 "realease"設定でコードをコンパイルすると、コンパイラはDebug.Assertをスキップします。

9

これは、使用している機能によって異なります。独自のメソッド内でアサーションを使用している場合は、正しく動作することを確認するために、だと思います。 - 可能であれば、私が考えることができるすべてを検証するために単体テストが好きです。

それはではありません。入力を検証するための良いアイデア(IMO)です。パラメーター。その場合、私はそれが通常の方法で例外を使用するためにはるかに一貫性のあると信じて:私の見解この動作はない変更はあなたがリリースコードを実行している必要があるという理由だけで

if (foo == null) 
{ 
    throw new ArgumentNullException("foo"); 
} 

を。

3

はい、アサーションは正常です。また、論理チェック(それは明らかです)だけでなく、コメントよりも信頼性の高い形式のドキュメントとしても機能することに注意してください。

ただし、単体テストについては事前にお考えください。デバッグビルドをテストする場合は、エラーロジックに関する結果がリリースバージョンと異なる場合があります。

リリースビルドでアクティブにするチェックのために、Trace.Assert()を使用できます。

まだ誰もCode Contractsを言及していませんが、より豊富でより構造的なコードのチェックと文書化の方法です。

+0

コード契約に関する1+ – Marcel

関連する問題