Различия между ссылочными типами данных string и array (C#)
Возможно это глупый вопрос но до меня так и не доходит в чем же тут дело. У меня есть вот такой код:
using System;
class HelloWorld {
static void Main() {
int[] array = new int[1]{777};
Change(array);
Console.WriteLine(array[0]);
string text = "Etot text ne izmenitsya";
Change(text);
Console.WriteLine(text);
}
static void Change(int[] array)
{
array[0] = 666;
}
static void Change(string text)
{
text = "Change this";
}
}
Я пытаюсь понять как работают ссылочные и значимые типы данных. В моем случае я использую массив и строку и как я понимаю оба обьекта относятся к ссылочным типам данных, однако когда я передаю значения массива и меняю их в методе они меняют значение в куче (куда по логике попадают все данные ссылочных типов), а когда передаю строку и меняю ее в методе - изменений нет. Я понимаю что наверное я выгляжу крайне глупо, но я не понимаю как так происходит. Может ли кто обьяснить почему так?
Ответы (1 шт):
Вы делаете немного разные вещи:
array[0] = 666;
Здесь вы меняете значение по индексу 0 по скопированной в стек вызванного метода ссылке на лежащий в куче массив массив. Элемент массива в куче меняется, и вы видите изменения глобально.
text = "Change this";
Здесь вы переприсваиваете скопированную в стек вызванного метода ссылку. Если вы будете дальше внутри этого метода работать с text, то вы будете работать с новой ссылкой. Глобально же изменений никаких не будет, text из Main по-прежнему хранит ссылку на "Etot text ne izmenitsya", изменилась только ссылка text внутри кадра стека Change.