Различия между ссылочными типами данных string и array (C#)

Рейтинг: 0Ответов: 1Опубликовано: 27.04.2023

Возможно это глупый вопрос но до меня так и не доходит в чем же тут дело. У меня есть вот такой код:

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.