Непреложное недоразумение или ошибка в Документах? - PullRequest
5 голосов
/ 09 октября 2008

Я только что видел это в документах MS Visual Studio, и часть, выделенная жирным шрифтом, не имеет смысла для меня. Это неправильно или я не правильно понимаю? Если вы запустите это, b будет содержать «привет» (как я и ожидал), а не «h».

Строки неизменны - содержимое объекта строки не может быть изменено после создания объекта, хотя синтаксис заставляет его выглядеть так, как будто вы можете это сделать. Например, когда вы пишете этот код, компилятор фактически создает новый строковый объект для хранения новой последовательности символов, , а переменная b продолжает содержать «h» .

string b = "h";

b + = "ello";

Ответы [ 13 ]

0 голосов
/ 09 октября 2008

Я не знаю, что делает C #, но я читал об этом на Java, и реализация, основанная на Java, была бы больше похожа на это:

string b = "h";

b = (новый StringBuilder (b)). Append ("ello"). ToString ();

Дело в том, что "+" или "Append" не существует для строки, потому что строка неизменна.

0 голосов
/ 09 октября 2008

Происходит то, что вы создаете новую переменную, которая содержит 'hello', а затем меняете b для ссылки на это, память для 'old' b по-прежнему содержит 'h', но это больше не нужно, так что мусор Коллектор очистит это. Вот почему так хорошо использовать строители строк при переборе и объединении строк - для получения дополнительной информации см. this .

0 голосов
/ 09 октября 2008

string b = "h"; b + = "ello";

b - это просто ссылка на объект в куче. На самом деле, после операции «+ =», b больше не ссылается на исходную «h». Теперь, это ссылка на новый строковый объект "hello", который является объединением "h" и "ello" Строка "h" будет собрана GC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...