Выбрать главу

using System;

class XYCoord { public int x, y;

public XYCoord()    :    this(0, 0)    {

Console.WriteLine("В конструкторе XYCoord()");

}

public XYCoord(XYCoord obj)    :    this(obj.x, obj.y) {

Console.WriteLine("В конструкторе XYCoord(obj)");

}

public XYCoord(int i, int j) {

Console.WriteLine("В конструкторе XYCoord(int, int)"); x = i;

У = j;

}

}

class OverloadConsDemo { static void Main()    {

XYCoord tl    =    new    XYCoord();

XYCoord t2    =    new    XYCoord(8,    9);

XYCoord t3    =    new    XYCoord(t2);

Console.WriteLine("tl.x,

tl.y:

" +

tl.x

+ \

" +

tl.y);

Console.WriteLine("t2.x,

t2. у:

" +

t2 .x

+ ",

" +

t2.y);

Console.WriteLine("t3.x,

t3.y:

" +

t3. x

+ ",

" +

t3.y);

}

}

Выполнение этого кода приводит к следующему результату.

В конструкторе XYCoord(int, int)

В конструкторе XYCoord()

В конструкторе XYCoord(int, int)

В конструкторе XYCoord(int, int)

В конструкторе XYCoord(obj)

tl.x, tl.y: 0, 0 t2 . x, t2 . у: 8, 9 t3.x, t3.у: 8, 9

Код в приведенном выше примере работает следующим образом. Единственным конструктором, фактически инициализирующим поля х и у в классе XYCoord, является конструктор XYCoord(int, int).А два других конструктора просто вызывают этот конструктор с помощью ключевого слова this. Например, когда создается объект

11, то вызывается его конструктор XYCoord (), что приводит к вызову this (0,    0),

который в данном случае преобразуется в вызов конструктора XYCoord (0, 0). То же самое происходит и при создании объекта t2.

Вызывать перегружаемый конструктор с помощью ключевого слова this полезно, в частности, потому, что он позволяет исключить ненужное дублирование кода. В приведенном выше примере нет никакой необходимости дублировать во всех трех конструкторах одну и ту же последовательность инициализации, и благодаря применению ключевого слова this такое дублирование исключается. Другое преимущество организации подобного вызова перезагружаемого конструктора заключается в возможности создавать конструкторы с задаваемыми "по умолчанию" аргументами, когда эти аргументы не указаны явно. Ниже приведен пример создания еще одного конструктора XYCoord.

public XYCoord(int х) : this(х, х) {    }

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

Инициализаторы объектов

Инициализаторы объектов предоставляют еще один способ создания объекта и инициализации его полей и свойств. (Подробнее о свойствах речь пойдет в главе 10.) Если используются инициализаторы объектов, то вместо обычного вызова конструктора класса указываются имена полей или свойств, инициализируемых первоначально задаваемым значением. Следовательно, синтаксис инициализатора объекта предоставляет альтернативу явному вызову конструктора класса. Синтаксис инициализатора объекта используется главным образом при создании анонимных типов в LINQ-выражениях. (Подробнее об анонимных типах и LINQ-выражениях — в главе 19.) Но поскольку инициализаторы объектов можно, а иногда и должно использовать в именованном классе, то ниже представлены основные положения об инициализации объектов.

Обратимся сначала к простому примеру.

// Простой пример, демонстрирующий применение инициализаторов объектов.

using System;

class MyClass { public int Count; public string Str;

class ObjlnitDemo { static void Main() {

// Сконструировать объект типа MyClass, используя инициализаторы объектов.

MyClass obj = new MyClass { Count = 100, Str = "Тестирование" };

Console.WriteLine(obj.Count + " " + obj.Str);

}