假设我有一个public void Foo(string bar)调用者不应该使用 null 值调用的方法bar。假设我也有一个方法,调用它private void FooImpl(string bar),它可以完成Foo. 当然,FooImpl这确实需要 的非空性bar,即使Foo是公共接口。假设我想使用 .NET 4.0 代码合同来强制执行这种非空性。
我把合同放在哪里?
如果我这样做:
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调用FooImpl,并建议我将非空合约添加到Foo. 好的,所以我想我不能将合同检查/异常抛出委托给实现方法。
但是如果我尝试将它放在公共界面中,即:
public void Foo(string bar)
{
Contract.Requires<ArgumentNullException>(bar != null);
this.FooImpl(bar);
}
private void FooImpl(string bar);
{
bar.Contains("test");
}
然后静态检查器抱怨FooImpl调用Contains了一个可能为空的值——即使FooImpl在代码中调用的唯一位置是 from Foo,它本身确保它永远不会FooImpl使用空值调用。
那么,我需要两次包含同一份合同吗?还是我应该忽略静态检查器?我知道这是一种忙碌的工作来源,不应该依赖它,但我希望它有一些方法来处理这个基本的,大概是常见的场景。