Вот как это работает. Строки являются ссылочным типом: ваша переменная A является ссылкой (как указатель) на строку в куче, и вы просто копируете значение указателя (адрес строки) в переменную B.
Ваш пример не изменяет значение A, когда вы назначаете «abcd» в B, потому что строки обрабатываются специально в .net. Они неизменны, как указывает Кевин, но важно также отметить, что они имеют семантику типа значения, то есть назначения всегда приводят к ссылке, указывающей на новую строку, и не меняют значение существующей строки, хранящейся в переменная.
Если вместо строк, вы использовали (например) автомобилей, и изменил свойство, вы увидите, что это так:
public class Car {
public String Color { get; set; }
}
Car A = new Car { Color = "Red" };
Car B = A;
B.Color = "Blue";
Console.WriteLine(A.Color); // Prints "Blue"
// What you are doing with the strings in your example is the equivalent of:
Car C = A;
C = new Car { Color = "Black" };
Это, вероятно, стоит отметить, что она не работает таким образом, для типов значений (целые числа, удвоения, поплавки, длинные, десятичные числа, булевы, структуры и т. д.). Они копируются по значению, если только они не помещены как Object
.
возможно дубликат http://stackoverflow.com/questions/1219664/c-sharp-reference-type-assignment-vs-value-type-assignment –
@Tudor Я думаю, что он ожидает, что значение " abcd ", который должен быть назначен A. –
@Chris Да, я – Marin