public void Foo(string bar)呼び出し元が の null 値で呼び出してはならないメソッドがあるとしますbar。private void FooImpl(string bar)の実際の作業を行うというメソッドも持っているとしましょうFoo。もちろん、FooImplがパブリック インターフェイスであるにもかかわらず、実際には が非 null である必要があります。そして、.NET 4.0 コード コントラクトを使用して、この非 null 性を強制したいとします。barFoo
契約書はどこに置く?
私がこれを行う場合:
public void Foo(string bar)
{
this.FooImpl(bar);
}
private void FooImpl(string bar);
{
Contract.Requires<ArgumentNullException>(bar != null);
// Something that requires non-nullness, e.g.:
bar.Contains("test");
}
Foo次に、静的チェッカーは が null の可能性がある値で呼び出していると不平を言い、FooImplnull 以外のコントラクトを に追加することを提案しFooます。わかりましたので、契約チェック/例外スローを実装メソッドに委譲することはできないと思います。
しかし、それをパブリックインターフェイスに入れようとすると、つまり:
public void Foo(string bar)
{
Contract.Requires<ArgumentNullException>(bar != null);
this.FooImpl(bar);
}
private void FooImpl(string bar);
{
bar.Contains("test");
}
次に、静的チェッカーは、が null 値FooImplで呼び出さContainsれる可能性があると不平を言います---FooImplコード内で呼び出される唯一の場所がfrom であってもFoo、それ自体が null 値で呼び出されることは決してないことが保証されFooImplます。
では、同じコントラクトを 2 回含める必要がありますか? または、静的チェッカーを無視する必要がありますか? 私はそれが一種の忙しい仕事の源であり、頼りにすべきではないことを知っていますが、この基本的でおそらく一般的なシナリオを処理する何らかの方法があることを願っています.