45

これが私の問題です。私は契約による設計の大ファンです。特に他の開発者が使用できるライブラリを開発するときに、この概念を使用しています。私はこれを行うための新しい方法を見つけました。それは:Contract.Requiresの代わりにException:だから:の代わりに:

public void SomeMethod(string name){
   if(name==null) throw new NullArgumentException("Null values not supported");
} 

私は今持っています:

public void SomeMethod(string name){
   Contract.Requires(name != null);
}

編集:私はデバッグモードでVS2010の下で働いています。

問題:ある場合でもContract.Requires、何もしません!namenull

MSDNのドキュメントには次のように書かれています。

囲んでいるメソッドまたはプロパティの前提条件コントラクトを指定します。

ただし、条件が満たされない場合は何も指定されません。

また、例外をスローし、メッセージを表示する他の オーバーロードがあることに気づきました...しかし、それでは何のためにあるのでしょうか?Contract.RequiresContract.Requires(Boolean)

以下の回答を編集して、APIのフルパワーを得るにはプラグインをインストールする必要があることを強調しましたが、Contract異なるプラットフォームでコードを同じように動作させたいMonoユーザーはどうでしょうか?

4

3 に答える 3

26

次のことを行う必要があります。

  1. nfechnerが指摘したように、CodeContractsアドインをインストールします
  2. プロジェクトのプロパティ、「コードコントラクト」フォルダに移動します
  3. 「ランタイムコントラクトチェックの実行」をチェックします
  4. 「組み立てモード」を「標準契約が必要」に切り替えます
  5. Contract.Requiresで置き換えますContract.Requires<SomeException>(最初の1つはスローSystem.Diagnostics.ContractExceptionし、2つ目は指定した例外をスローします。これはパブリックメソッドにとって重要です)

これが基本的な設定です。より正確な構成については、マニュアルを参照してください。

Monoを使用する場合、おそらく、Contractクラスは空です。私はこれを行っていませんが、契約マニュアルの第7章では、独自の実装を提供する方法を説明しているようです。

于 2011-11-28T19:19:44.013 に答える
11

コントラクトクラスのドキュメントから:

重要

コントラクトを適用するには、VisualStudioアドインをインストールする必要があります。Code Contracts Premium Editionアドインを使用すると、プロジェクトの[プロパティ]ページでコードコントラクトの静的および実行時のチェックを指定できます。実行時チェックを有効にしない場合、Contract.Ensures メソッドなどのコントラクトは、コントラクトに違反した場合に実行時に例外をスローしません。Visual Studioアドインは、VisualStudio2010またはWindowsSDKには付属していません。

于 2011-11-28T19:01:53.007 に答える
2

このようなメッセージでは、通常、何をしたかを正確に指定すると便利です。

たとえば、VSアドオンをインストールした場合、プロジェクトプロパティで有効にした場合、または実際にデバッグモードとリリースモードで実行している場合などは、元のメッセージに記載されていません。

Re Contract.RequiresvsContract.Requires<Exception>

Contract.Requiresがおすすめ。マニュアルによると

コードが特定の前提条件の失敗時に特定の例外をスローする必要がある場合は、以下の一般的なオーバーロードされた形式を使用できます。(コードでこのフォームにコミットする前に、セクション5.1をお読みください。Requires < Exn <Exn>>すべてのビルドでコントラクトツールを実行せずに使用することはできません。実行すると、毎回ランタイムエラーが発生します。)

于 2011-11-28T19:16:36.950 に答える