StringBuilder имеет репутацию более быстрого инструмента для работы со строками, чем просто конкатенация строк. Независимо от того, правда это или нет, мне остается задуматься о результатах операций StringBuilder и производимых ими строках.
Быстрый просмотр Reflector показывает, что StringBuilder.ToString () не всегда возвращает копию, иногда кажется, что она возвращает экземпляр внутренней строки. Также кажется, что используются некоторые внутренние функции для управления внутренними строками.
Так что я получу, если сделаю это?
string s = "Yo Ho Ho";
StringBuilder sb = new StringBuilder(s);
string newString = sb.ToString();
sb.Append(" and a bottle of rum.");
string newNewString = sb.ToString();
Являются ли newString и newNewString разными строковыми экземплярами или одинаковыми? Я пытался выяснить это с помощью отражателя, и я просто не совсем все понимаю.
Как насчет этого кода?
StringBuilder sb = new StringBuilder("Foo\n");
StringReader sr = new StringReader(sb.ToString());
string s = sr.ReadLine();
sb.Append("Bar\n");
s = sr.ReadLine();
Будет ли последний оператор возвращать ноль или "Bar"? И если он возвращает одно или другое, это определенное или неопределенное поведение? Другими словами, могу ли я на это положиться?
Документация по этому вопросу весьма лаконична, и я неохотно полагаюсь на наблюдаемое поведение, а не на спецификацию.