Создание объектов

Тема создания объектов может показаться на первый взгляд простой, но в действительности внутренняя “кухня” ее достаточно сложна. Вы должны хорошо понимать, какие операции имеют место во время создания нового экземпляра объекта или экземпляра значения, чтобы эффективно написать код конструктора и эффективно использовать инициализаторы полей.

К тому же в CLR конструкторы имеют не только экземпляры объектов, но также и типы, на которых они основаны. Другими словами, даже структуры и типы классов имеют конструктор, который представлен определением статического конструктора.

Статические конструкторы позволяют выполнить всю необходимую инициализацию при загрузке типа в домен приложения.

Ключевое слово new

Ключевое слово new позволяет создавать новые экземпляры объектов или значений. Однако оно ведет себя немного по-разному, когда применяется с типами значений и со ссылочными типами. Например, в С# ключевое слово new не всегда выделяет место в куче. Для начала поговорим о том, что оно делает с типами значений.

Использование new с типами значений

Ключевое слово new для типов значений необходимо только тогда, когда должен быть вызван один из конструкторов такого типа. В противном случае типы значений просто получают место, зарезервированное для них в стеке, и клиентский код должен их полностью инициализировать перед использованием.

Использование new с типами классов

Операция new необходима для создания объектов типа классов. В этом случае операция new выделяет для создаваемого объекта место в куче. Если достаточно места отыскать не удается, операция генерирует исключение типа System.OutOfMemoryException, прерывая весь остальной процесс создания объекта.

После того, как выделено место, все поля объекта инициализируются значениями по умолчанию. Это подобно тому, что делает сгенерированный компилятором конструктор для типов значений. Для полей ссылочных типов значением по умолчанию является null. Для полей ссылочных типов участки памяти, занятые их объектами, заполняются нулями. Таким образом, совокупный эффект состоит в том, что все поля в новом объекте инициализируются либо null, либо 0.

Как только это сделано, CLR вызывает соответствующий конструктор для экземпляра объекта. Конструктор выбирается на основе переданных параметров. При этом соответствие ищется по алгоритму сравнения параметров перегруженных методов, который принят в С#.

Операция new также устанавливает скрытый параметр this для последующего вызова конструктора, this представляет собой ссылку, доступную только для чтения.

Эта ссылка указывает на новый объект, созданный в куче, и тип этой ссылки совпадает с типом данного класса.

Рассмотрим следующий пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MyClass {
public MyClass ( int x, int у )
{
this.x = x;
this.у = у;
}
public int x;
public int y;
}
public class EntryPoint {
static void Main() {
// Так поступать нельзя!
// MyClass obj A = new MyClass ();
MyClass objA = new MyClass ( 1, 2 ) ;
System.Console.WriteLine( "objA.x= {0}, objA.y= {1}", objA.x, objА.у ) ;
}

Обратите внимание, что в методе Main создать новый экземпляр MyClass вызовом конструктора по умолчанию невозможно. Компилятор С# не создает конструктора по умолчанию для класса, если никакой другой конструктор не определен. Остальная часть кода достаточно очевидна. Сначала создается новый экземпляр MyClass, после чего его значение выводится на консоль.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100