4

.NET で Code Contracts を使い始めたばかりで、このようなガード句がありました

if (!file.Exists(path)) throw FileNotFoundException();

そしてそれを

Contract.Requires(File.Exists(path));

コントラクトは I/O の問題に対処するため、これが正しいかどうかはわかりませんが、これが問題かどうかはわかりません。

基本的な質問は次のとおりです。コントラクトを使用して I/O の懸念 (または外部/非ユニットの懸念) を確実にすることに問題はありますか?

4

2 に答える 2

6

通常、ファイルが存在するかどうかは前提条件です。Contract.Requires() を使用します。コントラクト検証の有効化はオプションであり、通常、リリース ビルドではオンになりません。これにより、テストが消えます。

率直に言って、このようなコードを書くべきではありません。ファイルを使用しようとすると例外が生成され、バージョンよりも情報が多くなります。見つからなかったファイルの名前が含まれています。さらに言えば、File.Exists() はマルチタスク オペレーティング システムでは信頼できません。Exists() 呼び出しの直後にスレッドが横取りされ、別のプロセスの別のスレッドがファイルを削除する可能性があります。そして、ハイゼン バグが発生します。FileNotFound 例外が存在することをテストしたにもかかわらず、FileNotFound 例外が発生します。

私の呼び出し: ステートメントを削除するだけです。それは解決するよりも多くの問題を引き起こします。

于 2010-07-05T13:20:27.457 に答える
3
  • ファイルが存在するかどうか不明な場合は、例外を使用しないでください。
  • ファイルが存在する必要があるが、例外的なケースでは存在しない可能性がある場合は、例外を使用します。
  • ファイルが存在しないことがプログラミング エラーであることが確実な場合は、Contract.Ensures を使用します。
于 2010-07-05T11:30:25.030 に答える