Подтвердить что ты не робот

Каково использование возвращаемого значения функции StringBuilder Append (string...)?

Полный синтаксис функции StringBuilder Append (string s) (и подобных функций)

StringBuilder myStringBuilder.Append(string myString)

так как myStringBuilder.Append(string myString) уже добавляет строку в myStringBuilder, мне было интересно, для чего нужно вернуть значение? Я никогда не видел код примера, который использует возвращаемое значение.

В соответствии с msdn он не возвращает новый экземпляр StringBuilder, а ссылку на текущий строитель (это будет myStringBuilder). Я просто не могу думать о сценарии, когда использование возвращаемого значения имеет смысл вообще, почему они не сделали тип возврата void?

4b9b3361

Ответ 1

Это означает, что вы можете легко соединять вызовы:

sb.Append("Foo=").Append(foo).Append("&Bar=").Append(bar);

... вместо использования нескольких отдельных операторов:

sb.Append("Foo=");
sb.Append(foo);
sb.Append("&Bar=");
sb.Append(bar);

Тот факт, что это одно выражение означает, что вы также можете использовать его в местах, где вы ограничены одним выражением, например. инициализации поля или оператора возврата. Последнее означает, что вы также можете использовать его для элементов с выраженным выражением:

public override string ToString() =>
    new StringBuilder("x").Append(...).Append(...).ToString();

(Во многих случаях использование string.Format или интерполированный строковый литерал имеет смысл, но иногда StringBuilder - это путь вперед...)

Ответ 2

Чтобы добавить больше пользы в ответ Джона Скита, стоит упомянуть, что это плавный дизайн API.

У этого есть свои плюсы и минусы, но, как уже указывал Джон Скит, не только с StringBuilder, но и во многих других классах и рамках, возможность плавного конфигурирования или выполнения вещей очень интересна.

Возможно, OP никогда не видел list.Where(x => ...).OrderBy(x => ...).Select(x => ...).ToList(). Или API-интерфейс быстрой конфигурации Castle Windsor: Component.For<X>().ImplementedBy<Y>().LifeStyleSingleton().

Вот почему StringBuilder возвращает экземпляр, из которого был вызван Append: возможность вызова других методов как цепочки, которые иногда кажутся более понятными, чем многие отдельные предложения.

Об минусах

@Джейсон попросил меня за минусы в комментариях:

Матиас, какие минусы?

Взятый из моего собственного опыта, я считаю, что есть несколько минусов, но одним из наиболее важных может быть то, что свободную цепочку можно отлаживать сложнее, поскольку вы не можете идти шаг за шагом во время интерактивной сессии отладки ( на самом деле вы можете вмешаться и выйти... но это менее удобно, чем шаг за шагом...).

За исключением того, что я нахожу свободный дизайн хорошим способом реализации автодокументированного кода, поскольку иногда он просто читает предложение на естественном языке и сохраняет все просто (для тех, кто уже привык к плавному дизайну...)