【发布时间】:2012-11-16 13:00:10
【问题描述】:
让我们看看这段代码:
public IQueryable<Category> GetAllActive()
{
Contract.Ensures(Contract.Result<IQueryable<Category>>() != null);
return dataSource.GetCategories(T => T.IsActive);
}
有个小问题。代码合约可以这样写吗:
public IQueryable<Category> GetAllActive()
{
Contract.Ensures(Contract.Result<IQueryable<Category>>() != null);
Contract.Ensures(Contract.Result<IQueryable<Category>>().All(T => T.IsActive));
return dataSource.GetCategories(T => T.IsActive);
}
还是不行?
这样的事情会不会产生不必要的序列枚举,这是非常不可取的?
【问题讨论】:
-
如果您使用的是完整的运行时合同检查器,我看不出它如何避免强制枚举发生 - 它还能如何检查它?
-
@Damien_The_Unbeliever 它不能。而且我没有使用运行时检查器。对我来说,现在,合约是一种让工具测试我的代码是否存在简单逻辑冲突的方法。
-
因此,如果您想要一个明确的答案,您需要澄清您正在使用合同系统的哪些部分。有很多选项可以打开。
-
@Damien_The_Unbeliever 我只使用静态检查器。
标签: c# .net ienumerable iqueryable code-contracts