Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Что происходит, когда мы передаём string в метод и обрабатываем его значение там, учитывая, что string — ссылочный и неизменный тип?

Допустим у нас есть код:
public static void Main()
{
string str = "str";
Update(str);
Console.WriteLine(str)
}
static void Update(string myStr) => myStr += "S";

Что тут происходит? У нас значение переменной str копируется в myStr и всё также как и со значимым типом или мы передаём ссылку на объект типа string, но строка myStr += "S"; просто не может изменить значение переменной, хотя и скомпилировалась?
  • Вопрос задан
  • 190 просмотров
Решения вопроса 1
freeExec
@freeExec
Участник OpenStreetMap
String хитрый тип, до недавнего времени его нельзя была задать в роли константы, т.к. он действительно ссылочный тип. Ещё по-умолчанию он интернированный, т.е все одинаковые тексты ссылаются на одним объект. Текст нельзя поменять, можно только создать новый объект с новым текстом.
У вас же передаётся ссылка на объект "str", а затем в методе создаётся новый объект текста и ссылка сохраняется в переменную.
Отсюда следует, что если вы собираете условный json постоянными склейками текстов, то вы генерируете кучу новых объектов - не эффективно расходуя память. Для это лучше использовать StringBuilder, который весь текст складывает в один буфер с заранее большей длинной.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman Куратор тега C#
C# the best
Ничего у вас не изменится. Для защиты строки перед вызовом update в il коде инструкция dup которая дублирует переменную на стеке и передаёт ее в функцию, и ссылка на новое значение будет записана в дубликат переменной, а исходная переменная не будет затерта.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы