Конструкторы в C#
Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать, что такое конструкторы в C#. В прошлой статье, посвященной классам в C# мы присваивали значения переменным объекта следующим образом:
Room myRoom = new Room(); //в начале создавали объект //затем инициализировали переменные myRoom.length = 7; myRoom.height = 2.5; myRoom.width = 4;
Данный способ является приемлемым, но не является оптимальным. Переменные необходимо определять в конструкторе класса.
Конструктор инициализирует объект при его создании, т.е. объект будет иметь заполненную структуру уже при создании. Конструктор имеет такое же имя, что и сам класс. По синтаксису похож на метод. В определении конструктора не указывается тип возвращаемого значения:
уровень_доступа имя_класса() { //тело конструктора }
В качестве уровня доступа обычно используется public, так как конструктор обычно вызывается вне класса. Все классы имеют конструкторы, независимо от того, создаёте вы его или нет (C# автоматически создаёт конструктор по умолчанию). Данный конструктор инициализирует все переменные-члены, имеющие тип значений, нулями, а переменные ссылочного типа — null значениями. Давайте создадим свой собственный конструктор, на основе предыдущего примера:
public Room() { length = 7; height = 2.5; width = 4; windows = false; }
Если мы теперь создадим объект класса Room, то его поле length (поле объекта) будет уже иметь значение, равное 7:
Room newRoom = new Room(); Console.WriteLine(newRoom.length);//выведет 7
В нашем примере использовался конструктор без параметров. А что если мы захотим изменить длину нашей комнаты. Для этого придётся написать newRoom.length = 6. Чтобы этого не делать, используются параметризированные конструкторы. Параметры вносятся в конструктор точно также, как и в метод. Давайте создадим параметризированный конструктор для нашего класса Room:
public Room(double a, double b, double c, boolean d) { length = a; height = b; width = c; windows = d; }
Давайте теперь создадим новый объект, передав в конструктор параметры:
Room newRoom = new Room(10,3,4,true); Console.WriteLine(newRoom.length); //выведет 10
При использовании оператора new объектам динамически выделяется память из пула свободной памяти. Данный объем свободной памяти не бесконечен. Есть риск возникновения ситуации, когда память под объект не будет выделена. Поэтому в схеме динамического выделения памяти есть механизм очистки от неиспользуемых объектов. Данный процесс может выполняться вручную (например в Javascript с помощью оператора delete). В C# за это отвечает механизм сборки мусора, который не требует участия программиста.
В языке C# можно определить метод, который будет вызываться непосредственно перед тем, когда объект будет уничтожен (т.е. когда его настигнет сборщик мусора). Этот метод называется деструктор. Синтаксис его следующий:
~имя_класса () { //тело деструктора }
Деструктор вызывается только перед началом работы системы сбора мусора. Мы не можем знать точно, когда будет вызван деструктор, но точно знаем, что он будет вызван перед завершением работы программы. Для нашего примера деструктор будет иметь вид:
~Room() { Console.WriteLine("Объект был стерт"); }
В качестве домашнего задания: переделайте пример из предыдущей статьи только с использованием параметризированного конструктора.
В данной статье вы узнали, что такое конструкторы в C#.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.