假设我有一个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
使用空值调用。
那么,我需要两次包含同一份合同吗?还是我应该忽略静态检查器?我知道这是一种忙碌的工作来源,不应该依赖它,但我希望它有一些方法来处理这个基本的,大概是常见的场景。