2011-07-14 12 views
18

私は一言で言えば、コード契約は実行時のパフォーマンスを低下させる可能性があります。実行時のコード契約

プロダクションでコード契約を無効にすることはできますか?

答えて

31

user manualは、これをかなり詳細に説明しています。選択できるオプションはすべてあります。各ビルド構成には、実行時にチェックされるコントラクトの設定が異なる場合があり、Visual Studioで調整可能な設定に基づいて、すべてまたは一部の契約を強制することができます。

3

プロジェクトのプロパティで[コード契約]に移動し、[リリース]設定を選択し、実行時のチェックをオフにします。

12

私は好きなオプションをon my blogと書いてあります。

要約すると:リリースモードで

  • を、私はランタイム契約を確認するが、契約リファレンスアセンブリを構築するために選択を実行オフにお勧めします。これにより、クライアントがオプションで(Call-site Requires Checkをチェックすると)使用できる個別のdllにPreconditionsが配置されますが、そのオプションをチェックしないとすべてのオーバーヘッドが削除されます。
  • デバッグモードで、実行時契約チェックをフルに設定します。

リリースビルドに含まれる前提条件を好む人もいます。これは、they don't support Code Contract dllsが原因でNuGet経由で配布する場合に特に便利です。私のNuGetパッケージでは、リリースビルドの前提条件を含む方へ移行していますが、「前提条件なしのリリース」ビルド用に別途ダウンロードすることもあります。

6

パフォーマンスの差はごくわずかであり、目立った方法でコードに影響することはありません。リアルタイムの株式取引システムを開発していない限り、私は真剣にそれについて心配しません。

プロダクションでコードを無効にする限り、私ははるかにわかりにくいエラーではなく、コードコントラクトの保護を追加しました。コード契約のエラーは、何らかの不正なデータがコールスタックツリー上の5つのレベルで渡されただけなので、いくつかの深いコールスタックで掘り下げることとは対照的に、契約が違反した場所と理由を正確に伝えます。

@svanryckeghemと@Stephenクリアリー: 使用しているか「ランタイム契約がチェック」Contract.Requires<TException>を使用することを計画していると有効にしない場合は、IL書き換えについての稼動時の障害(ccrewrite.exe)に必要を取得しますコード契約の使用に拘束される。これを有効にするには、ランタイム契約チェックを有効にする必要があります。

IMHOの場合、スローされる例外のタイプを制御できるため、Contract.Requires<TException>()の使用は、Contract.Requires()よりはるかに役立ちます。

+0

'Contract.Requires ()'、これはもっと便利だと私は反対しています。それはもっと遺産だと思います。私はまったく使っていません。契約には、ほぼすべての引数例外があり、ブール条件は十分な情報です。あなたが物事を適切に設計するなら。 「契約」は単に「例外」を行う別の方法ではなく、別のアプローチが必要です。 – nicodemus13

+4

あなたのコメントの有効フレーズは "...ほとんどすべての引数の例外..."です。私は「ほぼ」に基づいて契約をセットアップしたくありません。彼らがすべて同じタイプのExceptionであることを保証できれば、契約を使用してはいです。必要があります()は冗長です。しかし、これは保証されておらず、むしろすべてのシナリオ、特にエッジケースをカバーすることになります。そうでなければ、契約は推測だけになります。 –