私はクラス ライブラリを作成しており、その一部は世界中の他のユーザーによって使用されています。Visual Studio 2010 を使い始めた今、通常の古いものではなく、コード コントラクトを使用することに切り替えるのがどれほど良い考えなのか疑問に思っています。スタイルifステートメント。
すなわち。これの代わりに:
if (fileName == null)
throw new ArgumentNullException("fileName");
これを使って:
Contract.Requires(fileName != null);
私が質問している理由は、静的チェッカーを使用できないことを知っているためです。そのため、コンパイラーが検証できないいくつかの仮定について少し神経質になっています。これにより、静的チェッカーを使用している場合に、クラス ライブラリをダウンロードしてもコンパイルされない可能性があります。これは、問題を再現することさえできないという事実と相まって、修正するのが面倒になります。箱。
だから私はいくつかの質問があります:
- アクセスできる場合、静的チェッカーはデフォルトでオンになっていますか? または、クラス ライブラリでオンにする必要がある設定がありますか (静的チェッカーがないため、しません)。
- 私の恐れは不当ですか?上記のシナリオは実際の問題ですか?
どんなアドバイスでも大歓迎です。
編集:私が何を意味するのかを明確にしましょう。
クラスに次のメソッドがあるとします。
public void LogToFile(string fileName, string message)
{
Contracts.Requires(fileName != null);
// log to the file here
}
そして、私はこのコードを持っています:
public void Log(string message)
{
var targetProvider = IoC.Resolve<IFileLogTargetProvider>();
var fileName = targetProvider.GetTargetFileName();
LogToFile(fileName, message);
}
さて、ここで IoC が起動し、いくつかの「ランダムな」クラスを解決して、ファイル名を提供します。このライブラリの場合、null 以外のファイル名を返さないクラスを取得する方法はありませんが、IoC 呼び出しの性質上、静的分析ではこれを確認できません。 、したがって、可能な値がnullである可能性があると想定する場合があります。
したがって、静的分析では、LogToFile
メソッドが引数で呼び出されるリスクがあり、null
ビルドに失敗すると結論付ける場合があります。
コードに仮定を追加できることは理解しています。コンパイラは、fileName
そのメソッドから返される値が決してnullにならないことを前提としてそれを取るべきだと言っていますが、静的アナライザー(VS2010 Professional)がない場合は、上記のコードは私のためにコンパイルされるので、Ultimate を使用している誰かが見つけられるように、これを眠っているバグとして残しておくかもしれません。つまり、ここに問題がある可能性があるというコンパイル時の警告がないため、ライブラリをそのままリリースする可能性があります。
それで、これは本当のシナリオと問題ですか?