office.Area +
" кв. футов общей площади, из них\n " +
areaPP + " приходится на одного человека");
}
}
Ниже приведен результат выполнения этой программы.
Дом имеет:
2 этажа
4 жильца
2500 кв. футов общей площади, из них
625 приходится на одного человека
Учреждение имеет:
3 этажа
25 работников
4200 кв. футов общей площади, из них
168 приходится на одного человека
Как видите, данные из объекта houseполностью отделены от данных, содержащихся в объекте office. Эта ситуация наглядно показана на рис. 6.1.

Рис. 6.1. Переменные экземпляра одного объекта полностью отделены от переменных экземпляра другого объекта
В предыдущих примерах программ для объявления объекта типа Buildingиспользовалась следующая строка кода.
Building house = new Building();
Эта строка объявления выполняет три функции. Во-первых, объявляется переменная house, относящаяся к типу класса Building. Сама эта переменная не является объектом, а лишь переменной, которая может ссылаться на объект. Во-вторых, создается конкретная, физическая, копия объекта. Это делается с помощью оператора new. И наконец, переменной houseприсваивается ссылка на данный объект. Таким образом, после выполнения анализируемой строки объявленная переменная houseссылается на объект типа Building.
Оператор newдинамически (т.е. во время выполнения) распределяет память для объекта и возвращает ссылку на него, которая затем сохраняется в переменной. Следовательно, в C# для объектов всех классов должна быть динамически распределена память.
Как и следовало ожидать, объявление переменной houseможно отделить от создания объекта, на который она ссылается, следующим образом.
Building house; // объявить ссылку на объект
house = new Building(); // распределить память для объекта типа Building
В первой строке объявляется переменная houseв виде ссылки на объект типа Building. Следовательно, house— это переменная, которая может ссылаться на объект, хотя сама она не является объектом. А во второй строке создается новый объект типа Building, и ссылка на него присваивается переменной house. В итоге переменная houseоказывается связанной с данным объектом.
То обстоятельство, что объекты классов доступны по ссылке, объясняет, почему классы называются ссылочными типами. Главное отличие типов значений от ссылочных типов заключается в том, что именно содержит переменная каждого из этих типов. Так, переменная типа значения содержит конкретное значение. Например, во фрагменте кода
int х;
х = 10;
переменная х содержит значение 10, поскольку она относится к типу int, который является типом значения. Но в строке
Building house = new Building();
переменная house содержит не сам объект, а лишь ссылку на него.
Переменные ссылочного типа и присваивание
В операции присваивания переменные ссылочного типа действуют иначе, чем переменные типа значения, например типа int. Когда одна переменная типа значения присваивается другой, ситуация оказывается довольно простой. Переменная, находящаяся в левой части оператора присваивания, получает копию значения переменной, находящейся в правой части этого оператора. Когда же одна переменная ссылки на объект присваивается другой, то ситуация несколько усложняется, поскольку такое присваивание приводит к тому, что переменная, находящаяся в левой части оператора присваивания, ссылается на тот же самый объект, на который ссылается переменная, находящаяся в правой части этого оператора. Сам же объект не копируется. В силу этого отличия присваивание переменных ссылочного типа может привести к несколько неожиданным результатам. В качестве примера рассмотрим следующий фрагмент кода.
Building house1 = new Building();
Building house2 = house1;
На первый взгляд, переменные house1 и house2ссылаются на совершенно разные объекты, но на самом деле это не так. Переменные house1и house2, напротив, ссылаются на один и тот же объект. Когда переменная house1присваивается переменой house2, то в конечном итоге переменная house2просто ссылается на тот же самый объект, что и переменная house1.Следовательно, этим объектом можно оперировать с помощью переменной house1или house2. Например, после очередного присваивания
Читать дальше