3

次の代わりに CodeContracts の使用を開始できますか。

if (XXX == Y)
    throw new ArgumentException("bla bla");

ライブラリを開発し、ライブラリ ユーザーが CodeContracts を使用しない場合、どのように機能しますか?

4

3 に答える 3

2

コード コントラクトを使用するコードがバイナリ リライターを介して実行されると仮定すると、投稿したコードのような例外がスローされます。リライターはコードを調べて、契約コードを引数チェックなどに置き換えます。これは、アスペクト指向プログラミングのようなものです。コンパイル後に状況を処理するコードを挿入します。

コード コントラクトを使用しない場合、コントラクトを調べて、コントラクトとそのコードに基づいてエラーが発生する可能性があることを警告するように設計された静的分析を実行するメリットが得られません。

コード コントラクト

于 2010-12-20T15:08:46.283 に答える
1

要点:このようなステートメントを書くことは可能です

Contract.Requires<ArgumentNullException>(argumentToCheck, "argumentToCheck");

ビルド構成でランタイム チェッカーを有効にすると、リライターはこのような前提条件を通常の ArgumentNullException に書き換えます。

コードの呼び出し元には、コード コントラクトがインストールされているかどうかに関係なく、ArgumentNullException または指定した例外が表示されます。

于 2010-12-20T16:07:27.787 に答える
0

私はコードコントラクトを使用しており、カジュアルな使用のために、以前は適切な解決策がなかった 2 つのコードの問題に対処しています。

  • 戻り値のチェック チェック
  • 不変条件は、パラメーター チェック/エントリ ポイントと戻り値/終了ポイント アサーションを組み合わせた不適切な名前のようです。

戻り値の一時変数を宣言し、それを返す前にいくつかのことをアサートすることもできますが、それは余分な摩擦です。

パラメーターのチェックには既に解決策がありました: ArgumentException をスローします。

コード コントラクトは、ArgumentException に小さなことを 1 つ追加します。これにより、引数を非常に早い段階でチェックできるようになります。これは、私の意見では良いことです。

Code Contracts ではさらに多くのことが行われていますが、私は足を踏み入れただけで、非常に包括的な静的チェックを行うエディションを持っていません。私はコード コントラクトをより完全に使用できるように作業を進めていくつもりです。一度そうすると、コード コントラクトと if/then/throw ArgumentException の間を行ったり来たりするのではなく、同じフレームワークを使用してパラメーターをチェックする方がより洗練されます。

于 2010-12-20T15:16:35.170 に答える