web-dev-qa-db-ja.com

コード契約で構築しますか?

私は次の方法を持っています:

private void DoSomething(CoolClass coolClass)
{
    if (coolClass == null)
    {
        throw new ArgumentNullException("coolClass");
    }
    coolClass.Name = "Pepe";
}

コードコントラクトを使用すると、次のように記述できます。

private void DoSomething(CoolClass coolClass)
{
    Contract.Requires<ArgumentNullException>(coolClass != null, "IS NULLL!");
    coolClass.Name = "Pepe";
}

2番目の方法は短くて簡単です。私が抱えている問題は、ビルド時に実行時に例外がスローされないことです。次のように表示されます。

説明:アセンブリ(おそらく「CodeContractsTest」)は、Contract.Requiresを呼び出しており、CONTRACTS_FULLシンボルが定義されているため、コードコントラクトバイナリリライタ(CCRewrite)を使用してリライトする必要があります。 CONTRACTS_FULLシンボルの明示的な定義をプロジェクトから削除し、再構築します。 CCRewriteは http://go.Microsoft.com/fwlink/?LinkID=16918 からダウンロードできます。リライタをインストールした後、VisualStudioで[コードコントラクト]ペインのプロジェクトの[プロパティ]ページから有効にすることができます。 「ランタイムコントラクトチェックの実行」が有効になっていることを確認します。これにより、CONTRACTS_FULLが定義されます。

VSを使用しない限り、.netのCodeContractsを ここ からダウンロードします。

次に、プロジェクトの「ランタイムチェック」をチェックして、ランタイムでビルドすると例外がスローされるようにします。

私たちのアプリは、PowerShellスクリプトを使用してJenkinsでビルドされています。単純なコマンドや属性、または簡単な方法で、ランタイムをチェックインして例外をスローする方法はありますか?

16
elranu

シンプルさが好きなら、メソッドの独自のバージョンを書いてみませんか?

public class CustomContract
{
    public static void Requires<TException>( bool Predicate, string Message )
        where TException : Exception, new()
    {
       if ( !Predicate )
       {
          Debug.WriteLine( Message );
          throw new TException();
       }
    }
}  

フレンドリーなAPIを作成するためだけにコードコントラクトを使用すると、大砲でスズメを撃つように聞こえます。

3
Wiktor Zychla

次のプロジェクトプロパティを変更することで、実行中にこの例外が発生するのを防ぐことができました。

プロジェクトを右クリック->プロパティ->コード契約(タブ)アセンブルモードを「標準契約が必要」に変更し、チェックボックスも選択します-ランタイム契約チェックを実行します

5
NidhinSPradeep