Верните StringBuilder, если вы собираетесь изменить строку, иначе верните строку. Это вопрос API.
Что касается эффективности. Поскольку это неопределенный/общий вопрос без каких-либо особенностей, я думаю, что mutable vs. immutable более важен, чем производительность. Mutability - это проблема API, позволяющая вашему API возвращать модифицируемые объекты. Длина строки не имеет к этому отношения.
указано. Если вы посмотрите на StringBuilder.ToString с отражателем:
public override string ToString()
{
string stringValue = this.m_StringValue;
if (this.m_currentThread != Thread.InternalGetCurrentThread())
{
return string.InternalCopy(stringValue);
}
if ((2 * stringValue.Length) < stringValue.ArrayLength)
{
return string.InternalCopy(stringValue);
}
stringValue.ClearPostNullChar();
this.m_currentThread = IntPtr.Zero;
return stringValue;
}
Вы можете видеть, что это может сделать копию, но если вы измените его с StringBuilder, то он будет делать копию, то (это то, что я могу сказать, точку m_currentThread - это потому, что Append проверяет это и копирует его, если он не соответствует текущему потоку).
Я думаю, что конец этого заключается в том, что если вы не изменяете StringBuilder, вы не копируете строку, а длина не имеет отношения к эффективности (если вы не нажмете на это 2-е, если).
ОБНОВЛЕНИЕ
System.String это класс, который означает, что он является ссылочным типом (в отличие от типа значения), так что «строка Foo;» по существу, является указателем. (Когда вы передаете строку в метод, она передает указатель, а не копию.) System.String изменена внутри mscorlib, но неизменна вне ее, а именно, как StringBuilder может манипулировать строкой.
Итак, когда вызывается ToString(), он возвращает свой внутренний строковый объект по ссылке. На данный момент вы не можете изменить его, потому что ваш код не находится в mscorlib. Установив поле m_currentThread равным нулю, любые дальнейшие операции над StringBuilder заставят его скопировать строковый объект, чтобы его можно было изменить и не изменять строковый объект, который он возвращал в ToString(). Рассмотрим это:
StringBuilder sb = new StringBuilder();
sb.Append("Hello ");
string foo = sb.ToString();
sb.Append("World");
string bar = sb.ToString();
Если StringBuilder не сделать копию, то в конце Foo будет «Hello World», потому что StringBuilder изменил его. Но поскольку он сделал копию, тогда foo по-прежнему просто «Hello», а bar - «Hello World».
Означает ли это, что все возвращается/ссылка?
@SkippyFire спрашивает об эффективности. –
-1. Если вы собираетесь изменить строку, ее следует дополнительно модифицировать в рамках метода. Что делать, если этот метод вызывается из нескольких мест и изменяется логика манипуляции строкой? Было бы неплохо обновить логику в нескольких местах. –
Ник, вы раскалываете волосы. Если это относится к классу и частному методу, вы можете очень хорошо передать StringBuilder ко многим методам для создания окончательной строки. Вы можете сделать то же самое, когда каждый метод возвращает строку и объединяет их. SkippyFire не был специфичен вообще в том, как это используется. Это довольно просто: если вам нужно изменить, то return mutable, если вам не нужно mutable, то не возвращайте mutable. –