Он всегда существовал в C # и действительно на любом языке C-style (да, самый популярный язык C-стиля, кроме самого C!)
Несправедливо сравнивать его с синтаксисом VB6 With...End With
, так как в этом случае гораздо понятнее (о единственной хорошей вещи, которую я могу сказать о With...End With
VB6, это, по крайней мере, не так плохо, как Javascripts, поскольку он требует предыдущих точек).
Это, как говорили люди, комбинация "плавного интерфейса" и того факта, что оператор .
допускает пробелы до и после него, поэтому мы можем помещать каждый элемент в новые строки.
StringBuilder
- наиболее часто встречающийся случай в C #, например:
new StringBuilder("This")
.Append(' ')
.Append("will")
.Append(' ')
.Append("work")
.Append('.');
Связанный, но не совсем такой же шаблон - это то, где вы объединяете методы неизменяемого объекта, который возвращает другой объект того же типа, что и в:
DateTime yearAndADay = DateTime.UtcNow.AddYears(1).AddDays(1);
Еще один возвращает измененные объекты IEnumerable<T>
и IQueryable<T>
из методов, связанных с LINQ.
Они отличаются тем, что возвращают разные объекты, а не изменяют изменяемый объект и возвращают тот же объект.
Одна из основных причин того, что это чаще встречается в C ++ и Java, чем в C #, заключается в том, что C # имеет свойства. Это делает наиболее идиоматическим средством присвоения различных свойств вызов связанного установщика, который синтаксически совпадает с установкой поля. Тем не менее, он блокирует большую часть наиболее распространенного использования языка интерфейса.
Лично, поскольку идиома свободного интерфейса не гарантируется (нечего сказать, MyClass.setProp(32)
должен возвращать this
или действительно, что он не должен возвращать 32
, что также было бы полезно в некоторых случаях), и так как в C # это не так идиоматично, я предпочитаю избегать этого, кроме StringBuilder
, который является настолько известным примером, что он почти существует как отдельная StringBuilder
идиома в C #