首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >CodeContracts“必需”理解

CodeContracts“必需”理解
EN

Stack Overflow用户
提问于 2013-07-24 16:48:51
回答 2查看 512关注 0票数 5

我尝试使用以下代码对检索到的实体启用某种非空检查,以确保它们在执行某些具体业务之前是存在的:

代码语言:javascript
代码运行次数:0
运行
复制
protected T GetRequired<T>(object id)
    where T : EntityObject
{
    var obj = Get<T>(id);
    Contract.Requires<ArgumentNullException>(obj != null);
    return obj;
}

但在编译时,我得到了:

After contract block, found use of local variable 'obj' defined in contract block

我是不是用错了Contract.Requires

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-24 16:57:23

我是不是用错了Contract.Requires

是的,你是。Contract.Requires是指说明方法(或属性)的先决条件。如果要继续进行方法调用,这些条件必须是真的,否则就违反了约定。

让我们看看您的代码:

代码语言:javascript
代码运行次数:0
运行
复制
var obj = Get<T>(id);
Contract.Requires<ArgumentNullException>(obj != null);

在这里,您试图使用它来确保在方法完成执行(在本例中是Get方法)之后,某些内容是真的。这将是一个后置条件,为此,您将在Contract.Ensures的主体Get中使用

代码语言:javascript
代码运行次数:0
运行
复制
protected T Get<T>(object id) {
    Contract.Ensures(Contract.Results<T>() != null);
    // get and return result
}

最后,此编译器错误

在契约块之后,发现使用了在合同块中定义的局部变量obj

此消息是以下事实的结果:您不能在契约块之后使用Contract,并且契约块仅出现在方法主体的顶部。

票数 6
EN

Stack Overflow用户

发布于 2013-07-24 16:54:20

在这里,你似乎想同时做几件事:

应该在输入参数上直接使用Contract.Requires,例如,如果id永远不为null,那么就这样做:

代码语言:javascript
代码运行次数:0
运行
复制
Contract.Requires<ArgumentNullException>(id != null);

此外,您似乎希望保证结果不是null。这样做:

代码语言:javascript
代码运行次数:0
运行
复制
Contract.Ensures(obj != null);

类似地,辅助方法(Get)也可以检查其他契约。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17840172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档