public void Foo(string bar)
呼び出し元が の null 値で呼び出してはならないメソッドがあるとしますbar
。private void FooImpl(string bar)
の実際の作業を行うというメソッドも持っているとしましょうFoo
。もちろん、FooImpl
がパブリック インターフェイスであるにもかかわらず、実際には が非 null である必要があります。そして、.NET 4.0 コード コントラクトを使用して、この非 null 性を強制したいとします。bar
Foo
契約書はどこに置く?
私がこれを行う場合:
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 の可能性がある値で呼び出していると不平を言い、FooImpl
null 以外のコントラクトを に追加することを提案し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 回含める必要がありますか? または、静的チェッカーを無視する必要がありますか? 私はそれが一種の忙しい仕事の源であり、頼りにすべきではないことを知っていますが、この基本的でおそらく一般的なシナリオを処理する何らかの方法があることを願っています.