答えて
user manualは、これをかなり詳細に説明しています。選択できるオプションはすべてあります。各ビルド構成には、実行時にチェックされるコントラクトの設定が異なる場合があり、Visual Studioで調整可能な設定に基づいて、すべてまたは一部の契約を強制することができます。
プロジェクトのプロパティで[コード契約]に移動し、[リリース]設定を選択し、実行時のチェックをオフにします。
私は好きなオプションをon my blogと書いてあります。
要約すると:リリースモードで
- を、私はランタイム契約を確認するが、契約リファレンスアセンブリを構築するために選択を実行オフにお勧めします。これにより、クライアントがオプションで(Call-site Requires Checkをチェックすると)使用できる個別のdllにPreconditionsが配置されますが、そのオプションをチェックしないとすべてのオーバーヘッドが削除されます。
- デバッグモードで、実行時契約チェックをフルに設定します。
リリースビルドに含まれる前提条件を好む人もいます。これは、they don't support Code Contract dllsが原因でNuGet経由で配布する場合に特に便利です。私のNuGetパッケージでは、リリースビルドの前提条件を含む方へ移行していますが、「前提条件なしのリリース」ビルド用に別途ダウンロードすることもあります。
パフォーマンスの差はごくわずかであり、目立った方法でコードに影響することはありません。リアルタイムの株式取引システムを開発していない限り、私は真剣にそれについて心配しません。
プロダクションでコードを無効にする限り、私ははるかにわかりにくいエラーではなく、コードコントラクトの保護を追加しました。コード契約のエラーは、何らかの不正なデータがコールスタックツリー上の5つのレベルで渡されただけなので、いくつかの深いコールスタックで掘り下げることとは対照的に、契約が違反した場所と理由を正確に伝えます。
@svanryckeghemと@Stephenクリアリー: 使用しているか「ランタイム契約がチェック」Contract.Requires<TException>
を使用することを計画していると有効にしない場合は、IL書き換えについての稼動時の障害(ccrewrite.exe)に必要を取得しますコード契約の使用に拘束される。これを有効にするには、ランタイム契約チェックを有効にする必要があります。
IMHOの場合、スローされる例外のタイプを制御できるため、Contract.Requires<TException>()
の使用は、Contract.Requires()
よりはるかに役立ちます。
- 1. コード契約ビルドパフォーマンス
- 2. コード契約エラー
- 3. コード契約のベストプラクティス
- 4. スプリングクラウド契約フレームワークと契約確認テスト実行
- 5. ペックスとコード契約
- 6. コード契約とコードアナライザ
- 7. ジェネリックヘルパーによるコード契約
- 8. コード契約と非同期
- 9. 実行時にWCFで実行時にサービス契約の実装を切り替えます
- 10. 春クラウド契約のデバッグ契約テストケース
- 11. Debug.Assertとコード契約の使用
- 12. Ethereum契約コードの可視化
- 13. コード契約の例外使用例
- 14. 異なるプロジェクトでのコード契約
- 15. 春クラウド契約時の確認
- 16. 契約
- 17. コード契約を開始する場所
- 18. .Netコード契約 - 詳細はどこ?
- 19. コード契約はモノですか?
- 20. コード契約、forallおよびカスタムenumerable
- 21. コード契約オーバーロードされたメソッド
- 22. 実装からのWCF分離契約
- 23. C#契約の実装と例外
- 24. WCFサービス - 複数契約の実装
- 25. キルビル契約を一時停止する
- 26. ランタイム時にサービス停止.netオペレーション契約
- 27. サービス契約図
- 28. 契約tapply
- 29. スプリングクラウド契約 - ファーンクライアント
- 30. トラブルトリュフ契約モジュール
'Contract.Requires()'、これはもっと便利だと私は反対しています。それはもっと遺産だと思います。私はまったく使っていません。契約には、ほぼすべての引数例外があり、ブール条件は十分な情報です。あなたが物事を適切に設計するなら。 「契約」は単に「例外」を行う別の方法ではなく、別のアプローチが必要です。 –
nicodemus13
あなたのコメントの有効フレーズは "...ほとんどすべての引数の例外..."です。私は「ほぼ」に基づいて契約をセットアップしたくありません。彼らがすべて同じタイプのExceptionであることを保証できれば、契約を使用してはいです。必要があります()は冗長です。しかし、これは保証されておらず、むしろすべてのシナリオ、特にエッジケースをカバーすることになります。そうでなければ、契約は推測だけになります。 –