Страница 67 из 502
<b> // Параметризированный конструктор для класса Building, </b>
<b> public Building(int f, int a, int o) {</b>
<b> Floors = f;</b>
<b> Area = a;</b>
<b> Occupants = o;</b>
<b> } </b>
<b> // Возвратить площадь на одного человека, </b>
<b> public int AreaPerPerson() {</b>
<b> return Area / Occupants;</b>
<b> }</b>
<b> // Возвратить максимальное количество человек, занимающих здание,</b>
<b> // исходя из заданной минимальной площади на одного человека. </b>
<b> public int MaxOccupant(int minArea) { </b>
<b> return Area / minArea;</b>
<b> }</b>
<b>}</b>
<b>// Использовать параметризированный конструктор класса Building, </b>
<b>class BuildingDemo { </b>
<b> static void Main() {</b>
<b> Building house = new Building(2, 2500, 4);</b>
<b> Building office = new Building(3, 4200, 25);</b>
<b> Console.WriteLine("Максимальное количество человек в доме, n" +</b>
<b> "если на каждого должно приходиться " +</b>
<b> 300 + " кв. футов: " + house.MaxOccupant(300));</b>
<b> Console.WriteLine("Максимальное количество человек " +</b>
<b> "в учреждении, n" +</b>
<b> "если на каждого должно приходиться " +</b>
<b> 300 + " кв. футов: " + office.MaxOccupant(300) );</b>
<b> }</b>
<b>}</b>
Результат выполнения этой программы оказывается таким же, как и в предыдущей ее версии.
Оба объекта, house и office, были инициализированы конструктором Building() при их создании в соответствии с параметрами, указанными в этом конструкторе. Например, в строке
<b>Building house = new Building(2, 2500, 4);</b>
конструктору Building() передаются значения 2, 2500 и 4 при создании нового объекта. Следовательно, в копиях переменных экземпляра Floors, Area и Occupants объекта house будут храниться значения 2, 2500 и 4 соответственно.
Еще раз об операторе new
Теперь, когда вы ближе ознакомились с классами и их конструкторами, вернемся к оператору new, чтобы рассмотреть его более подробно. В отношении классов общая форма оператора new такова:
<b><i>new имя_класса</i> (<i>список_аргументов)</i></b>
где имя_класса обозначает имя класса, реализуемого в виде экземпляра его объекта. А имя_класса с последующими скобками обозначает конструктор этого класса. Если в классе не определен его собственный конструктор, то в операторе new будет использован конструктор, предоставляемый в C# по умолчанию. Следовательно, оператор new может быть использован для создания объекта, относящегося к классу любого типа.
Оперативная память не бесконечна, и поэтому вполне возможно, что оператору new не удастся распределить память для объекта из-за нехватки имеющейся оперативной памяти. В этом случае возникает исключительная ситуация во время выполнения (подробнее об обработке исключительных ситуаций речь пойдет в главе 13). В примерах программ, приведенных в этой книге, ситуация, связанная с исчерпанием оперативной памяти, не учитывается, но при написании реальных программ такую возможность, вероятно, придется принимать во внимание.
В связи с изложенным выше возникает резонный вопрос: почему оператор new нецелесообразно применять к переменным таких типов значений, как int или float? В C# переменная типа значения содержит свое собственное значение. Память для хранения этого значения выделяется автоматически во время прогона программы. Следовательно, распределять память явным образом с помощью оператора new нет никакой необходимости. С другой стороны, в переменной ссылочного типа хранится ссылка на объект, и поэтому память для хранения этого объекта должна распределяться динамически во время выполнения программы.
Благодаря тому что основные типы данных, например int или char, не преобразуются в ссылочные типы, существенно повышается производительность программы. Ведь при использовании ссылочного типа существует уровень косвенности, повышающий издержки на доступ к каждому объекту. Такой уровень косвенности исключается при использовании типа значения.
Но ради интереса следует все же отметить, что оператор new разрешается использовать вместе с типами значений, как показывает следующий пример.
<b>int i = new int();</b>
При этом для типа int вызывается конструктор, инициализирующий по умолчанию переменную i нулевым значением. В качестве примера рассмотрим такую программу.
<b>// Использовать оператор new вместе с типом значения.</b>
<b>using System;</b>
<b>class newValue {</b>
<b> static void Main() {</b>