これが私の問題です。私は契約によるデザインの大ファンです。他の開発者が使用できるライブラリを開発する場合は特に、このコンセプトを使用しています。私はこれを行う新しい方法を見つけました:Exception
の代わりに_Contract.Requires
_:したがって、代わりに:
_public void SomeMethod(string name){
if(name==null) throw new NullArgumentException("Null values not supported");
}
_
私は今持っています:
_public void SomeMethod(string name){
Contract.Requires(name != null);
}
_
[〜#〜] edit [〜#〜]:VS2010でデバッグモードで作業しています。
問題:name
がnull
であっても、_Contract.Requires
_は何もしません。
[〜#〜] msdn [〜#〜] のドキュメントにはこう書かれています:
囲んでいるメソッドまたはプロパティの前提条件コントラクトを指定します。
ただし、条件が満たされない場合の指定はありません。
例外をスローする other _Contract.Requires
_オーバーロードが存在することにも気付きましたが、メッセージは表示されます...しかし、Contract.Requires(Boolean)
は何ですか?
[〜#〜] edit [〜#〜]以下の回答は、Contract
APIでは、別のプラットフォームでコードを同じように動作させたいMonoユーザーについてはどうでしょうか。
次のことを行う必要があります。
Contract.Requires
とContract.Requires<SomeException>
(最初のものはSystem.Diagnostics.ContractException
2番目は、指定した例外をスローしますが、これはパブリックメソッドにとって重要です)これが基本的なセットアップです。より正確な設定については、 マニュアルを参照
Monoを使用している場合、おそらく、Contractクラスは空です。私はこれをしていませんが、Contractsマニュアルの第7章で、独自の実装を提供する方法を説明しているようです。
契約クラスのドキュメント から:
重要
契約を実施するには、Visual Studioアドインをインストールする必要があります。 Code Contracts Premium Edition アドインを使用すると、プロジェクトの[プロパティ]ページでコードコントラクトの静的チェックとランタイムチェックを指定できます。ランタイムチェックを有効にしない場合、 Contract.Ensures メソッドなどのコントラクトは、コントラクトに違反した場合に実行時に例外をスローしません。 Visual Studioアドインは、Visual Studio 2010またはWindows SDKに同梱されていません。
このようなメッセージでは、通常、実行した内容を正確に指定すると役立ちます。
たとえば、VSアドオンをインストールしたか、プロジェクトのプロパティで有効にしたか、実際にデバッグモードとリリースモードで実行しているかなど、元のメッセージには触れません。
Re Contract.Requires
vs Contract.Requires<Exception>
Contract.Requires
をお勧めします。マニュアルによると
特定の前提条件が満たされない場合にコードで特定の例外をスローする必要がある場合は、以下の一般的なオーバーロードされたフォームを使用できます。 (コードでこのフォームにコミットする前に、セクション5.1をお読みください。すべてのビルドでコントラクトツールを実行せずに
Requires < Exn <Exn>>
を使用することはできません。実行すると、毎回ランタイムエラーが発生します。)