Конструкторы

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

  • Конструктор не возвращает значение, даже типа void.
  • Класс может иметь несколько конструкторов с разными параметрами для разных видов инициализации.
  • Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов — значение null.
  • Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

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

using System;namespace ConsoleApplication1{ class Demo { public Demo( int a, double y ) // конструктор с параметрами { this.a = a; this.y = y; } public double Gety() // метод получения поля y { return y; } int a; double y; } class Class1 { static void Main() { Demo a = new Demo( 300, 0.002 ); // вызов конструктора Console.WriteLine( a.Gety() ); // результат: 0,002 Demo b = new Demo( 1, 5.71 ); // вызов конструктора Console.WriteLine( b.Gety() ); // результат: 5,71 } }}

Листинг 5.6. Класс с конструктором (html, txt)

Часто бывает удобно задать в классе несколько конструкторов, чтобы обеспечить возможность инициализации объектов разными способами. Все конструкторы должны иметь разные сигнатуры.

Если один из конструкторов выполняет какие-либо действия, а другой должен делать то же самое плюс еще что-нибудь, удобно вызвать первый конструктор из второго. Для этого используется уже известное вам ключевое слово this в другом контексте, например:

class Demo { public Demo( int a ) // конструктор 1 { this.a = a; } public Demo( int a, double y ) : this( a ) // вызов конструктора 1 { this.y = y; } ... }

Конструкция, находящаяся после двоеточия, называется инициализатором.

Как вы помните, все классы в C# имеют общего предка — класс object. Конструктор любого класса, если не указан инициализатор, автоматически вызывает конструктор своего предка.