【发布时间】:2010-06-29 13:24:15
【问题描述】:
假设我有一个方法public void Foo(string bar),调用者不应使用空值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 的唯一位置来自Foo,它本身确保它永远不会使用空值调用FooImpl。
那么,我需要将同一份合同包含两次吗?还是我应该忽略静态检查器?我知道这是一种忙碌的工作来源,不应该依赖它,但我希望它有一些方法可以处理这种基本的、可能很常见的场景。
【问题讨论】:
标签: c# .net-4.0 code-contracts