2012-01-30 4 views
11

これまで何らかの議論があったStackOverflowのスレッドを見たことがありますが、もう一度見つけることができません。リリースビルドでのSystem.Diagnostics.Contractの使用

私はSystem.Diagnostics.Contractクラスを '実コード'、つまり実動コードのリリースビルドで使用する必要があるかどうかを知りたいですか?私はこれに尋ねます。なぜなら、契約はデバッグや分析の目的であると思われる名前空間の記述に基づいているからです。

機能の前/後の状態が重要で、if/then/elseのチェックをたくさん書くのを避けるために役立つライブラリのようですが、そうであれば、コアライブラリですか?

+1

タイトルに「C#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

答えて

11

第5.1(引数の検証および契約)documentationのは、あなたが契約を使用するために検討するかもしれない三つの主要な使用モードの詳細を:のみデバッグ中に契約を経由して

  1. 引数の検証はありませんリリースビルドで、ビルドします。
  2. リリースビルドでも検証します。
  3. リリースビルドでのカスタム引数の検証、デバッグビルドでの契約のみ。

リリースビルドで契約を使用する少なくとも1つの使用モードがあります。少なくとも公式ドキュメントの場合と同じです。

引用:あなたがあなた自身のコード内で契約の使用を開始する前に

、あなたはその影響がどのような契約形態の引数の検証、どこで(図2を参照)に使用するいくつかの意思決定をする必要があります。

契約ツールを最も簡単に使用できるのは、リリースビルドで実行時に引数の検証を実行する必要がないと判断した場合です(各プロジェクトでは、使用法1)。その場合、開発中に契約ツールを使用しますが、出荷されたビットは使用しません。クライアントは、リリース・ビットと一緒に契約参照アセンブリを出荷することができるので、クライアントはコールサイトの要求チェックを介してデバッグビルドのパラメータ検証のランタイム・チェックを取得できます。

リリースビルドで引数の検証が必要な場合は、すべてのビルド(契約2)の契約チェックを有効にするのが最も簡単な方法です。したがって、これらのツールを利用して、条件の実行時文字列を生成し、契約継承を実行することができます。パラメータの検証に特定の例外を生成するか、デフォルトのContractExceptionを持つかを選択できます。リリースビルドで契約ツールを使用するリスクは、生産品質レベルに達していないツールに依存することです。

最も簡単な組み合わせは、リリースビルドで引数の検証が必要な場合ですが、リリースビルドでは実行時にのみ使用されますが、リリースビルドでは使用されません(使用法3)。その場合は、if-then-throwステートメント(legacy-requiresと呼ぶ)を使用して、すでに行ったように引数の検証を続けなければなりません。これらをツールで検出可能にする場合は、後に他のコントラクト(保証など)を追加するか、他のコントラクトが存在しない場合はContract.EndContractBlock()を使用します。リリースビルドでランタイムチェックツールを使用していないため、契約の継承を取得することはなく、オーバーライドとインターフェイスの実装でレガシー要求を手動で繰り返す必要があります。インターフェイスと抽象メソッドでは、通常の要求でコントラクトクラスを作成し、フォームを保証してデバッグビルドをチェックし、コントラクトリファレンスアセンブリに表示され、従属プロジェクトや静的チェッカーに表示されるような場合でも、

これはまた、フレームワークの他の部分のみを使用した代替方法を示唆しています。if-then-throwを使用する通常の方法。

関連する問題