2011-12-09 10 views
21

しかし私は私の仲間の従業員の何人かに尋ねたときに、彼らが何であるか、それが何であるかを簡単に説明することはできませんでした。.Netコード契約 - 詳細はどこ?

誰もリソース、説明、および使用方法に関するチュートリアルはありますか?

おかげで、

ポール

答えて

25

コードコントラクトは、.NET 4.0の中に導入された、彼らはプログラムでコーディング仮定を表現するための言語に依存しない方法を提供します。

基本的には、事前条件、事後条件およびその他の機能をチェックすることができ、テストプロセスと最終的なコードの質を大幅に向上させることができます。マイクロソフトから

  • 実行時検査。バイナリリライタは、プログラム>実行の一部としてチェックされるコントラクトを注入することによってプログラムを変更します。書き換えられたプログラムは、テスト容易性を向上させます。各契約は、オラクルとして機能し、合格/不合格のテストを実行します。 Pexなどの自動テストツールは、事前条件を満たさない無意味なテスト引数を除外することにより、より意味のある単体テストを生成する契約を利用します。

  • 静的検査。静的チェッカーは、プログラムを実行しなくても契約違反があるかどうかを判断できます。これは、明示的な契約と同様に、暗黙のデリバリや配列境界などの暗黙的な契約をチェックします。

  • ドキュメンテーションの生成。私たちのドキュメントジェネレータは、契約情報で既存のXMLドキュメントファイルを補強します。生成されたドキュメントページに契約セクションがあるようにSandcastleで使用できる新しいスタイルシートもあります。

詳しい情報:

+0

おかげRionmonster、これは参考になりました! –

17

コード契約は、関数の入力と出力にチェックを実行する比較的新しい方法です。それらがあなたの標準と異なるところでは、入力チェックを行う生成されたILは、関数が呼び出される直前にそれをチェックし、関数が実際に終了した後に出力をチェックするコードです。

これはなぜ便利ですか?

これは、関数が返ってきてバグが導入される可能性があると思われる場合に、変数を変更できないようにします。

例を示します。

public void doSomething(SomeObject foo) 
{ 
    Contract.Requires<ArgumentNullException>(foo != null); 
} 

ここで、コード契約では、チェックの前にコードがないことが必要です。生成されたILでは、fooの値が呼び出し前にテストされます。あなたの入力が期待どおりであることを確実にする確実な方法です。

もう1つはContract.Ensuresです。これは基本的にRequiresのようなものですが、戻り値で動作します。

public int doSomethingElse() 
{ 
    Contract.Ensures(Contract.Result<int>() != 0); 
    int ret = 1; 
    return ret; 
} 

あなたの関数から複数の出口のパスを持っていた場合、これは特に有用であろう...

public int someBadFunction() 
{ 
    Contract.Ensures(Contract.Result<int>() != 0); 
    if(....) 
    { 
     if(....) return 2; 
     if(....) return 8; 
    } 
    return 3; 
} 
関連する問題