Как. Net сохраняет строковые переменные, значение которых одинаково? - PullRequest
2 голосов
/ 11 апреля 2020

Как. Net сохраняет строковые переменные, значение которых одинаково? Например,

string str1 = “xyz”;
string str2 = “xyz”;

Другой сценарий:

string str1 = str2  = str3 = “xyz”;

Будет ли для них обоих одна или две ячейки памяти?

Я был спросил о вопросе в одном из моих недавних интервью. Насколько я понимаю, я ответил, что если значение одинаковое, то этому значению будет выделена отдельная память, и str1, и str2 будут указывать на эту область памяти. То же самое произойдет во втором сценарии, упомянутом в вопросе. Но интервьюер не был убежден. У кого-нибудь есть мысли по этому поводу?

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Будет ли одна ячейка памяти для них обоих или две разные ячейки памяти?

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

Компилятор может оптимизировать строковые константы, однако это называется интернированием строк. В этом случае у вас все еще есть 2 ссылки, но они указывают на один и тот же адрес.

0 голосов
/ 11 апреля 2020

Память выделяется только один раз из-за того, как CLR использует Intern Pool для дублирующихся строковых значений. Ссылка на обе строки будет одинаковой.

Проверьте ссылку, используя - Object.ReferenceEquals(str1, str2);

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

string myVar = "This is my string";
        string myVar1 = myVar;

        unsafe
        {
            TypedReference tr = __makeref(myVar);
            IntPtr ptr = **(IntPtr**)(&tr);

            TypedReference tr1 = __makeref(myVar1);
            IntPtr ptr1 = **(IntPtr**)(&tr1);

            Console.WriteLine(ptr);
            Console.WriteLine(ptr1);
        }

enter image description here

Местоположение памяти, на которое они указывают, одинаково. Значение сохраняется в памяти только один раз.

Если вы присваиваете ту же строку другим переменным, то такая же ссылка берется из внутреннего пула и присваивается строковой переменной.

...