moh_mou Ответов: 1

Если string является ссылочным типом, как можно изменить его значение из другого объекта в виде массива


string-это ссылочный тип,как я могу изменить его значение из другого объекта, например из массива

Массив:
var numbers = new int[] {1,2,3};
var numbers2 = numbers;
numbers2[0] = 9;
Console.WriteLine(numbers[0]); //Output is:9 because arrays is a rference type


Что я уже пробовал:

Строка:
var numbers = new string(new char[]{'o','n','e'});
var numbers2 = numbers;
numbers2 = "two";
Console.WriteLine(numbers); //why the output here is "one" it should be "two" it is a reference type??!!

Ralf Meier

Я не могу дать вам научного объяснения , но ваш второй пример / код - это задание, а не ссылка.
Строки, целочисленные, одиночные, двойные и т. д.-Это объекты, но также и базовые типы. Базовые типы обычно присваивают свое значение и не ссылаются на него ..

1 Ответов

Рейтинг:
6

OriginalGriff

Потому что ... string-это ссылочный тип! :смеяться:
Взгляните на начало этого: Использование структуры и класса - что это такое?[^] это объясняет разницу и то, что происходит, когда вы назначаете ссылки. (Возможно, вы захотите пропустить последнюю половину на данный момент, она становится немного занятой для начинающих).

Как только вы хорошо прочитаете, это, надеюсь, будет иметь смысл, и тогда вы сможете точно объяснить, что вы пытаетесь сделать, а я попытаюсь объяснить, как это сделать.


moh_mou

Я изменил код, чтобы быть более ясным. Я не могу получить четкую причину для этого :(

OriginalGriff

Прочтите статью еще раз: int-это тип значения, строка-ссылочный тип, массив любого типа-ссылочный тип.
Когда вы копируете тип значения, вы копируете его.
Когда вы копируете ссылочный тип, вы копируете ссылку.
Поэтому, когда вы копируете ссылку на массив в первом коде, оба числа и numbers2 "указывают" на одни и те же данные - измените один, и это повлияет на данные, которые они оба используют.
Когда вы копируете ссылку во втором коде, вы копируете ссылку на строковые данные, а не на саму переменную. Затем вы перезаписываете одну из ссылок, но это не влияет на другую, потому что это не та же самая переменная.
С типами значений переменная * является * данными - с ссылочными типами переменная является "указателем" на данные, а не на сами данные.
Ваш второй кусок кода-это не то же самое как во-первых, это эквивалент в:
var numbers = new int [] {1,2,3};
var numbers2 = числа;
numbers2 = new int [] {4, 5, 6};
numbers2[0] = 9;