web-dev-qa-db-ja.com

契約。使用が必要

これが私の問題です。私は契約によるデザインの大ファンです。他の開発者が使用できるライブラリを開発する場合は特に、このコンセプトを使用しています。私はこれを行う新しい方法を見つけました:Exceptionの代わりに_Contract.Requires_:したがって、代わりに:

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

私は今持っています:

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

[〜#〜] edit [〜#〜]:VS2010でデバッグモードで作業しています。

問題:namenullであっても、_Contract.Requires_は何もしません。

[〜#〜] msdn [〜#〜] のドキュメントにはこう書かれています:

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

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

例外をスローする other _Contract.Requires_オーバーロードが存在することにも気付きましたが、メッセージは表示されます...しかし、Contract.Requires(Boolean)は何ですか?

[〜#〜] edit [〜#〜]以下の回答は、Contract AP​​Iでは、別のプラットフォームでコードを同じように動作させたいMonoユーザーについてはどうでしょうか。

43
GETah

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

  1. Nfechnerが指摘したように、Code Contractsアドインをインストールします
  2. プロジェクトプロパティの「Code Contracts」フォルダに移動します
  3. 「実行時の契約確認の実行」をチェックします
  4. 「アセンブリモード」を「標準契約が必要」に切り替えます
  5. Contract.RequiresContract.Requires<SomeException>(最初のものはSystem.Diagnostics.ContractException 2番目は、指定した例外をスローしますが、これはパブリックメソッドにとって重要です)

これが基本的なセットアップです。より正確な設定については、 マニュアルを参照

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

26
Pavel Gatilov

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

重要

契約を実施するには、Visual Studioアドインをインストールする必要があります。 Code Contracts Premium Edition アドインを使用すると、プロジェクトの[プロパティ]ページでコードコントラクトの静的チェックとランタイムチェックを指定できます。ランタイムチェックを有効にしない場合、 Contract.Ensures メソッドなどのコントラクトは、コントラクトに違反した場合に実行時に例外をスローしません。 Visual Studioアドインは、Visual Studio 2010またはWindows SDKに同梱されていません。

11
nfechner

このようなメッセージでは、通常、実行した内容を正確に指定すると役立ちます。

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

Re Contract.Requires vs Contract.Requires<Exception>

Contract.Requiresをお勧めします。マニュアルによると

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

2
sgmoore