使用NBuilder for .NET,.Has(..)和.Have(..)之间有什么区别?

时间:2011-03-16 00:38:45

标签: c# .net nbuilder

NBuilder有两种以下流畅的方法

.Has(..)
.Have(..)

例如

return Builder<User>.CreateListOfSize(100)
    .WhereTheFirst(1)
        .Has(x => x.FirstName = "Jon Skeet")
    .Build();

return Builder<User>.CreateListOfSize(100)
    .WhereTheFirst(1)
        .Have(x => x.FirstName = "Jon Skeet")
    .Build();

我不明白这个区别?有人可以解释为什么我会做一个而不是有...反之亦然?

2 个答案:

答案 0 :(得分:2)

他们是完全相同的。完整源代码here

<强>有:

    [Obsolete(Messages.NewSyntax_UseWith)]
    public static IOperable<T> Has<T, TFunc>(this IOperable<T> operable, Func<T, TFunc> func)
    {
        return With(operable, func);
    }

<强>有:

    [Obsolete(Messages.NewSyntax_UseWith)]
    public static IOperable<T> Have<T, TFunc>(this IOperable<T> operable, Func<T, TFunc> func)
    {
        return With(operable, func);
    }

答案 1 :(得分:1)

HasHave的原因是在两种不同的用途中提供流畅的语法。

例如,Has在这种情况下有意义:

Builder<User>.CreateListOfSize(100)
    .WhereTheFirst(1)
        .Has(x => x.FirstName = "Jon Skeet")
    .Build();

虽然Have在这种情况下有意义:

Builder<User>.CreateListOfSize(100)
    .WhereAll()
        .Have(x => x.FirstName = "Jon Skeet")
    .Build();

然而,最近,人们认识到需要清理语法以防止因创建列表与单个对象时语法的差异而产生混淆。

现在您可以执行以下操作:

Builder<User>.CreateListOfSize(100)
    .All()
        .With(x => x.FirstName = "Jon")
    .TheFirst(1)
        .With(x => x.LastName = "Skeet")
    .Build();

......希望未来可能不那么混乱。

另外,你会在ClosureCowboy给出的答案中注意到HasHave扩展已经被标记为过时了,当他回答时......