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

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

В связи с изложенным выше возникает резонный вопрос: почему оператор new нецелесообразно применять к переменным таких типов значений, как int или float? В C# переменная типа значения содержит свое собственное значение. Память для хранения этого значения выделяется автоматически во время прогона программы. Следовательно, распределять память явным образом с помощью оператора new нет никакой необходимости. С другой стороны, в переменной ссылочного типа хранится ссылка на объект, и поэтому память для хранения этого объекта должна распределяться динамически во время выполнения программы.
Благодаря тому что основные типы данных, например int или char, не преобразуются в ссылочные типы, существенно повышается производительность программы. Ведь при использовании ссылочного типа существует уровень косвенности, повышающий издержки на доступ к каждому объекту Такой уровень косвенности исключается при использовании типа значения.
Но ради интереса следует все же отметить, что оператор new разрешается использовать вместе с типами значений, как показывает следующий пример:
   int i = new int () ;
При этом для типа int вызывается конструктор по умолчанию, инициализирующий переменную i нулевым значением. В качестве примера рассмотрим такую программу:

// Использовать оператор new вместе с типом значения.

using System;

class newValue {
   static void Main() {
      int i = new int(); // инициализировать переменную i нулевым значением

         Console.WriteLine("Значение переменной i равно: " + i) ;
   }
}


Выполнение этой программы дает следующий результат:
   Значение переменной i равно: 0
Как показывает результат выполнения данной программы, переменная i инициализируется нулевым значением. Напомним, что если не применить оператор new, то переменная i окажется неинициализированной. Это может привести к ошибке при попытке воспользоваться ею в операторе, содержащем вызов метода WriteLine (), если предварительно не задать ее значение явным образом.
В общем, обращение к оператору new для любого типа значения приводит к вызову конструктора, используемого по умолчанию для данного типа. Но в этом случае память динамически не распределяется. Откровенно говоря, в программировании обычно не принято пользоваться оператором new вместе с типами значений.