【问题标题】:Code contracts together with frameworks not using it代码合同与不使用它的框架一起
【发布时间】:2011-02-08 07:24:24
【问题描述】:

我有这个代码:

return session.Query<Payment>()
    .OrderBy(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize)
    .ToArray();

由于 NHibernate 的 Query 方法没有任何 Contract.Ensures,我收到此警告:

CodeContracts:需要未经证实:source != null

为了解决这个问题,我写了这个:

var query = session.Query<Payment>();
Contract.Assume(query != null);
return query
    .OrderBy(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize)
    .ToArray();

这是正确的做法吗?现在 Resharper 认为 query 可以为 null,因为我将它与 null 进行比较。

可能对标有“NotNull”属性的实体进行“空”赋值

【问题讨论】:

    标签: c# .net nhibernate resharper code-contracts


    【解决方案1】:

    是的,这是正确的做法。 Resharper 默认不理解代码契约,请查看 this question 来解决这个问题。

    你可能想在你的库中创建一个 Query 方法,它只调用 NHibernate 的 Query,但也有一个 Ensures 合约,这样你就不必在任何地方使用 Assume

    类似的东西(我在这里猜测类型):

    static IQueryable<T> MyQuery<T>(this Session s)
    {
        Contract.Requires(s != null);
        Contract.Ensures(Contract.Result<IQueryable<T>>() !=  null);
    
        var result = s.Query<T>();
        Contract.Assume(result != null);
        return result;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-26
      • 2013-01-11
      • 1970-01-01
      • 2011-10-23
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多