Строки c # являются ссылочными типами - почему, когда я изменяю значение ссылки A, ссылка B не изменяется? - PullRequest
1 голос
/ 01 марта 2011

Если строки в .NET являются ссылочными типами, почему в приведенном ниже коде строка2 не изменяется на «привет» после изменения строки1?

static void IsStringReallyAReference()
{
    string string1 = "hello";
    string string2 = string1;

    Console.WriteLine("-- Strings --");
    Console.WriteLine(string1);
    Console.WriteLine(string2);

    string1 = "hi";

    Console.WriteLine(string1);
    Console.WriteLine(string2);
    Console.Read();

}

/*Output:
hello
hello
hi
hello*/

Ответы [ 4 ]

13 голосов
/ 01 марта 2011

Это потому, что строки C # являются неизменяемыми типами, что означает, что вы не можете изменить значение экземпляра.

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

5 голосов
/ 01 марта 2011

Это изображение может быть полезным для вас, чтобы понять концепцию.

enter image description here

2 голосов
/ 01 марта 2011

Это потому, что строки являются неизменяемыми типами в .Net, т.е. каждый раз, когда вы изменяете строку, создается новая строка.

Из MSDN

Строка называется неизменной, потому что его значение не может быть изменено, как только оно был создан. Методы, которые появляются изменить строку на самом деле вернуть новая строка, содержащая модификация.

Проверьте раздел замечаний этой ссылки: http://msdn.microsoft.com/en-us/library/system.string(v=VS.80).aspx

1 голос
/ 01 марта 2011

Когда вы присвоили "hi" для string1, получилось так, что переменной string1 была присвоена новая ссылка на объект в куче, содержащий текст "hi".

Принимая во внимание, что переменная string2 все еще содержит ссылку на объект, в котором есть текст "hello" .

...