Нужен ли StringBuilder ToString()

Надеюсь, это будет быстро. У меня есть StringBuilder так:

StringBuilder sb = new StringBuilder();

Я добавляю к моему StringBuilder так:

sb.Append("Foo");
sb.Append("Bar");

Затем я хочу сделать это равным строковой переменной. Делаю ли я это так:

string foobar = sb;

Или вот так:

string foobar = sb.ToString();

Является ли первый ленивым или последний добавляет больше кода, чем необходимо?

Спасибо


person JMK    schedule 15.02.2012    source источник
comment
Извините, думал, что одни и те же принципы применимы к обоим!   -  person JMK    schedule 15.02.2012
comment
Что лениво, так это то, что вы не можете просто попробовать оба и увидеть, что один не работает -1   -  person weston    schedule 15.02.2012
comment
Честно говоря, я спросил, потому что использовал StreamWriter и заметил, что он работает с .ToString() или без него, я не думал, что это может быть перегрузка метода StreamWriter.   -  person JMK    schedule 15.02.2012
comment
Понятно, в таком случае оставьте ToString() выключенным при звонке. В худшем случае перегрузка вызовет его для вас, а в лучшем случае у него может быть какая-то умная оптимизация. Но в любом случае разработчики языка добавили перегрузку для вашего удобства, так что можете ее использовать.   -  person weston    schedule 15.02.2012
comment
Вы также не можете неявно преобразовать StreamWriter в string. И вызов .ToString() не даст вам содержания писателя.   -  person Magnus    schedule 15.02.2012
comment
@Magnus, он имеет в виду, что вызывает метод StreamWriter.Write(object value). С StringBuilder в качестве его value.   -  person weston    schedule 15.02.2012


Ответы (9)


В Java вы все равно не можете определить неявные преобразования между типами, помимо того, что указано в спецификации, поэтому вы все равно не можете преобразовать из StringBuilder в String; вам нужно позвонить toString().

В C# может быть неявное определяемое пользователем преобразование между StringBuilder и String (определенное либо в StringBuilder, либо в String), но его нет, поэтому вам все равно придется вызывать ToString().

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

person Jon Skeet    schedule 15.02.2012

В C# вам нужно использовать string foobar = sb.ToString();, иначе вы получите сообщение об ошибке: Cannot implicitly convert type 'System.Text.StringBuilder' to 'string'

person Anders Wendt    schedule 15.02.2012

В Java string foobar = sb; не компилируется. Вы должны использовать String foobar = stringBuilder.toString();

person Marcelo    schedule 15.02.2012

Вы могли бы проверить это, прежде чем спрашивать... Вы бы видели, что

string foobar = sb;

не компилируется (С#).

Используйте sb.ToString().

person ken2k    schedule 15.02.2012

Предыдущие ответы верны, просто чтобы прояснить некоторые вещи. StringBuilder не является подклассом String, поэтому вы не можете преобразовать StringBuilder в String. Метод toString() класса StringBuilder создает объект String, поэтому его следует использовать для "преобразования" из StringBuilder в String. Надеюсь это поможет.

person Egor    schedule 15.02.2012

При преобразовании в String используйте toString в Java. (ToString на С#)

person Azodious    schedule 15.02.2012

ToString() в StringBuilder требуется для преобразования в String.

String str=sb.toString();
person Balaswamy Vaddeman    schedule 15.02.2012

String foobar = sb.ToString();

должен быть использован. Так как это преобразует StringBuilder в String, а затем присваивает значение.

Используя строку foobar = sb; выдаст вам ошибку времени компиляции «Невозможно неявно преобразовать тип в»

person Harsh    schedule 15.02.2012

В Java все объекты имеют функцию toString(), унаследованную от суперкласса Object. StringBuilder (SB) изменяем, String — нет. Назначение SB (Mutable) для String (неизменяемой) требует копирования внутреннего буфера символов и возврата неизменяемого экземпляра String.

person Bimalesh Jha    schedule 15.02.2012