Верните StringBuilder, если вы собираетесь дополнительно изменить строку, в противном случае верните строку. Это вопрос API.
Относительно эффективности. Поскольку это неопределенный / общий вопрос без каких-либо подробностей, я думаю, что изменчивость против неизменности важнее производительности. Изменчивость - это проблема 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-ую, если).
UPDATE
System.String - это класс, который означает, что это ссылочный тип (в отличие от типа значения), поэтому "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».
Это проясняет весь вопрос возврата / ссылки?