2013-09-02 7 views
2

В нижеприведенном фрагменте у меня есть две переменные firstString и secondString, которые имеют одинаковое значение «Hello». Таким образом, ссылочное местоположение для обеих переменных одинаково.Управление объектами

var firstString = "Hello"; 
var secondString = "Hello"; 
bool isSameReference = Object.ReferenceEquals(firstString, secondString); 
//same reference for both variables 

Но обновление secondString значение, как «Эй» не обновляет firstString, даже если он referes в том же месте. Почему эти переменные не обновляются, что относится к одному и тому же ссылочному местоположению?

secondString = "Hey.."; 
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//reference changed but firstString not updated 

Обновление secondString на это проницаемым значение, как «Hello» делает ссылку же.

secondString = "Hello"; 
isSameReference = Object.ReferenceEquals(firstString, secondString); 
//now the reference for both variables are same 

Почему C# имеет такое поведение и как внутренняя обработка frmaework обрабатывает это? Заранее спасибо

+0

Как вы наблюдаете «ссылку» и что привело вас к предположению, что обе строки хранятся по одному адресу? – Gusdor

+0

'secondString =" -Hello ".Substring (1);' даст другую ссылку. –

+1

@Gusdor, используя метод Object.ReferenceEquals –

ответ

5

Процесс называется интернированием. Вы можете узнать больше о интернировании строк there. Это позволило сохранить некоторое пространство и время обработки при распределении нового укуса с тем же содержимым, что и уже существующий. Кроме того, укусы интернинга делают струны сложной тривиальной операцией. Это возможно, так как String является неизменным типом.

0

C# (.NET) хранит каждый строковый литерал только один раз в куче .NET. Строки «Hello» и «Hey ...» хранятся в двух разных местах в куче .NET. Первоначально firstString и secondString указывают на расположение «Hello». secondString = "Hey .."; просто измените переменную secondString, чтобы указать на место в куче, где находится «Эй ...». Вы должны знать, что строковая переменная содержит адрес (ссылку) места в куче, где действительно находится строка.

1

Вы не обновили строку, вы обновили ссылку на строку, которая теперь указывает на «эй ...», которая не включает ссылку на строку «Привет» firstString. Кроме того, «компилятор» C# собирает каждую статическую строку в вашем коде в списке без дублетов, вот почему две разные «Hello» s в разных местах - это одна и та же строка, если вы сравниваете ссылку на них.

Смежные вопросы