2011-11-28 8 views
9

すべての新しい.NET 4.0コードを想定するリリースビルドで.NET 4.0のコード契約のランタイムチェックを有効にする必要がありますか?

私はそれらを有効にするオプションがあることがわかります。しかし、私はベストプラクティスが何かを見ていないのですか?

一度静的なチェックが行われると、コンパイラは条件が満たされていることを確認しているので、実際に実行時のチェックを行う必要はありません。または、コンパイラがそれをチェックしても、実行時に条件が満たされないというシナリオがありますか?

これに関する良いオンラインディスカッションや記事です。どちらかを行う方法を説明する多くのものがありますが、多くはないが、後方互換性のない新しい.NET 4.0コードを前提としたベストプラクティスについて説明しています。

答えて

5

条件が満たされていることをコンパイラが確認しているので、

スタティックベリファイヤがアプリケーション全体を確認できることは非常にまれです。私たちは通常、主要な部分を解決します。

リリースビルドで.NET 4.0のコード契約のランタイムチェックを有効にする必要がありますか?

おそらくない オプション

が、前提条件のみのような軽いものの一つ。

パフォーマンスクリティカルなコードについては、完全に無効にしたい場合があります。

4

使用方法によって異なります。あなたが使用している場合は

モード「カスタム契約が必要です」:あなたが使用している場合

public void SomeMethod(SomeClass x) 
{ 
    if (x == null) throw new ArgumentNullException("x"); 
    Contract.EndContractBlock(); 

    ... 
} 

をあなたが安全に実行時チェックをオフにして、そして

あなたのエラーチェックと例外を保つ「標準契約が必要です。」モード:

public void SomeMethod(SomeClass x) 
{ 
    Contract.Requires<ArgumentNullException>(x != null); 

    ... 
} 

実行時のチェックを少なくとも「ReleaseRequires」レベルにする必要があります。そうでないと、すべてのエラーチェックが失われ、予期しない例外が発生する可能性があります(例:ArgumentNullExceptionの代わりにNullReferenceExceptionのコードの深い部分)

非常に単純な理由で、 Contract.Requires<E>以外の契約が失敗した場合、実行時にSystem.Diagnostics.ContractExceptionがスローされ、おそらくユーザーを喜ばしくないでしょう。

ところで、Henk Holtermanは静的検証が限られており、完全にそれに頼るべきではないことは間違いありません。

関連する問題