Хотя принятый ответ касается этого (как и некоторых других), я хотел дать ответ, посвященный тому, что, по-видимому, вы на самом деле спрашиваете, а именно о семантике присваивания переменных.
Переменные в C # - это просто фрагменты памяти, отведенные для хранения одного значения. Важно отметить, что не существует такой вещи, как «переменная значения» и «ссылочная переменная», поскольку переменные содержат только значения.
Различие между «значением» и «ссылкой» связано с типом. Тип значения (VT) означает, что весь фрагмент данных хранится в переменной.
Если у меня есть целочисленная переменная с именем abc
, которая содержит значение 100
, то это означает, что в моем приложении есть четырехбайтовый блок памяти, в котором хранится буквенное значение 100
. Это связано с тем, что int
является типом значения и, следовательно, все данные хранятся в переменной.
С другой стороны, если у меня есть переменная string
с именем foo
, которая содержит значение "Adam"
, то здесь задействованы две фактические ячейки памяти. Первый - это часть памяти, в которой хранятся действительные символы "Adam"
, а также другая информация о моей строке (ее длина и т. Д.). ссылка на это местоположение сохраняется в моей переменной. Ссылки очень похожи на указатели в C / C ++; хотя они не совпадают, для этого объяснения достаточно аналогии.
Итак, чтобы подвести итог, значением для ссылочного типа является ссылка на другое место в памяти, где значением для типа значения является сами данные .
Когда вы присваиваете что-то переменной, все, что вы изменяете, это значение переменной . Если у меня есть это:
string str1 = "foo";
string str2 = str1;
Тогда у меня есть две строковые переменные, которые содержат одно и то же значение (в этом случае каждая из них содержит ссылку на одну и ту же строку, "foo"
.) Если затем сделать это:
str1 = "bar";
Затем я изменил значение str1
на ссылку на строку "bar"
. Это совсем не меняет str2
, так как его значение все еще является ссылкой на строку "foo"
.