Главная arrow Язык программирования C# arrow C# Полное руководство Герберт Шилдт arrow Переменные ссылочного типа и присваивание C# Полное руководство Герберт Шилдт

Переменные ссылочного типа и присваивание C# Полное руководство Герберт Шилдт

В операции присваивания переменные ссылочного типа действуют иначе, чем переменные типа значения, например типа int. Когда одна переменная типа значения присваивается другой, ситуация оказывается довольно простой. Переменная, находящаяся в левой части оператора присваивания, получает копию значения переменной, находящейся в правой части этого оператора. Когда же одна переменная ссылки на объект присваивается другой, то ситуация несколько усложняется, поскольку такое присваивание приводит к тому, что переменная, находящаяся в левой части оператора присваивания, ссылается на тот же самый объект, на который ссылается переменная, находящаяся в правой части этого оператора. Сам же объект не копируется. В силу этого отличия присваивание переменных ссылочного типа может привести к несколько неожиданным результатам. В качестве примера рассмотрим следующий фрагмент кода:
   Building house1 = new Building ();
   Building house2 = housel;

На первый взгляд, переменные housel и house2 ссылаются на совершенно отдельные объекты, но на самом деле это не так. Переменные housel и house2, напротив, ссылаются на один и тот же объект. Когда переменная housel присваивается переменой house2, то в конечном итоге переменная house2 просто ссылается на тот же самый объект, что и переменная housel. Следовательно, этим объектом можно оперировать с помощью переменной housel или house2. Например, после очередного присваивания
   house1.Area = 2600; оба метода WriteLine ()
   Console.WriteLine(house1.Area);
   Console.WriteLine(house2.Area);

выводят одно и то же значение: 2600.
   Несмотря на то что обе переменные, house1 и house2, ссылаются на один и тот же объект, они никак иначе не связаны друг с другом.
Например, в результате следующей последовательности операций присваивания просто изменяется объект, на который ссылается
переменная house2:
   Building housel = new Building();
   Building house2 = housel;
   Building house3 = new Building();
   house2 = house3; // теперь обе переменные, house2 и house3, ссылаются на один и тот же объект.

После выполнения этой последовательности операций присваивания переменная house2 ссылается на тот же самый объект, что и переменная house3. А ссылка на объект в переменной housel не меняется.