В чем разница между.Has(..) и.Have(..) в NBuilder для.NET?

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 ответа

Решение

Они одинаковые. Полный исходный код здесь.

Имеет:

    [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);
    }

Причина была Has а также Have должен был обеспечить свободный синтаксис в двух разных целях.

Например, 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, что Has а также Have расширения уже были помечены как устаревшие, когда он ответил...

Другие вопросы по тегам