double arrow

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


Конструкторы экземпляров - предназначены для инициализации вновь созданных экземпляров класса. Это специальный тип метода, который присваивает начальные значение членам класса, производит другие инициализирующие действия.

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

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

Конструктор, вызываемый без параметров, называется конструктором по умолчанию.

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

class Demo

{

public Demo( int a ) // конструктор 1

{

this.a = a:

this.у = 0.002;

}

public Demo( double у ) // конструктор 2

{

this.a = 1:

this.у = у;




}

Demo x = new Demo( 300 ); // вызов конструктора 1

Demo у = new Demo( 5.71 ); // вызов конструктора 2

}

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

class Demo

{

public Demo( int a ) { this.a = a; } // конструктор 1

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

}

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

Важным моментом здесь является инициализация базового класса. Для вызова конструктора базового класса используется ключевое слово base. Вместо долгого формального описания, просто покажем пример:

class BaseClass

{

int _a;

public int A

{

get { return _a; }

}

public BaseClass( int a ){ _a = a; }

}

class InheritedClass : BaseClass

{

public InheritedClass() : base(1){ }

}

Закрытые конструкторы или классы без экземпляров

В C# нет глобальных переменных, функций или констант. Все они обязательно должны принадлежать некоторому классу. И если у вас имеется класс, содержащий в себе, например, некоторые нужные вам константы, то экземпляры такого класса вам не нужны (так как вы создали этот класс исключительно как хранилище). Чтобы запретить создание экземпляров класса, следует объявить в нем конструктор как закрытый (то есть с модификатором private или вовсе без модификатора - так как отсутствие модификатора и подразумевает private). Это означает, что создать экземпляр такого класса не удастся (что нам и надо).



Вот пример такого класса:

//Класс без экземпляраclass MyClass{ //Закрытый конструктор private MyClass() { } public static int MyPhoneNumber=1239999;}class Test{ public static void Main() { System.Console.WriteLine(MyClass.MyPhoneNumber); }}

В данном случае класс MyClass имеет закрытый конструктор так, что создавать его экземпляры мы не можем. Приведем пример ошибочного применения такого класса:

class Test{ public static void Main() { MyClass a=new MyClass(); //ошибка!!! }}

Использовать же статические переменные и константы такого класса мы можем (подобно тому, как в классе Test мы выводим на экран статическую константу MyPhoneNumber класса MyClass).

Разумеется, в таком классе могут содержаться и методы:

class MyClass { //Закрытый конструктор private MyClass() { } public static int MyPhoneNumber=1239999; public static int SomeNumber=1; public static int GetSomeNumber() { SomeNumber++; return SomeNumber; } }class Test{ public static void Main() { System.Console.WriteLine(MyClass.GetSomeNumber()); //Выведется 2 System.Console.WriteLine(MyClass.GetSomeNumber()); //Выведется 3 }}






Сейчас читают про: