Деструкторы

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

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

Свойства конструкторов:

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

 

сlass Demo

{

Public Demo (int a, double y) // Конструктор с параметрами

{

this.a = a;

this.y = y;

}

Public double Gety() // Метод получения поля y

{

return y;

}

int a;

double y;

}

 

сlass 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

}

}

 

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

 

class Demo

{

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

{

this.a = a;

this.y = 0.002;

}

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

{

this.a = 1;

this.y = y;

}

 

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

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

 

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

сlass Demo

{

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

{

this.a = a;

}

public Demo(int a, double y) : this(a) // Вызов конструктора 1

{

this.y = y;

}

}

 

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

Некоторые классы содержат только статические данные, и, следовательно, создать экземпляры таких объектов не имеет смысла.

class D

{

private D(){} // закрытый конструктор

static D() // статический конструктор

{

a = 200;

}

static int a;

static double b = 0.002;

public static void Print()

{

Console.WriteLine(“a=” + a);

Console.WriteLine(“b=” + b);

}

}

 

 

Средства языка C# позволяют определить метод, который должен вызываться непосредственно перед тем, как объект будет окончательно разрушен системой сбора мусора. Этот метод называется деструктором, и его можно использовать для обеспечения гарантии “чистоты” ликвидации объекта. Например, вы могли бы использовать деструктор для гарантированного закрытия файла, открытого некоторым объектом. Формат записи деструктора такой:

~имя_класса()

{ // код деструктора }

Очевидно, что элемент имя_класса здесь означает имя класса. Таким образом, деструктор объявляется подобно конструктору за исключением того, что его имени предшествует символ “тильда” (~). (Подобно конструктору, деструктор не возвращает значения).

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

// Демонстрация использования деструктора.

using System; class Destruct

{

public int x; public Destruct(int i) { x = i; } // Вызывается при утилизации объекта.

~Destruct()

{

Console.WriteLine("Деструктуризация " + x);

} // Метод создает объект, который немедленно

// разрушается.

public void generator(int i)

{

Destruct о = new Destruct(i);

}

}

class DestructDemo

{

public static void Main()

{

int count; Destruct ob = new Destruct(0); /* Теперь сгенерируем большое число объектов. В какой-то момент начнется сбор мусора. Замечание: возможно, для активизации этого процесса вам придется увеличить количество генерируемых объектов. */

for(count = 1; count < 100000; count++)

ob.generator(count);

Console.WriteLine("Готово!");

}

}

Вот как работает эта программа. Конструктор устанавливает переменную экземпляра x равной известному числу. В данном примере x используется как ID (идентификационный номер) объекта. Деструктор отображает значение переменной x при утилизации объекта. Рассмотрим метод generator(). Он создает объект класса Destruct, а затем разрушает его с уведомлением об этом.

 

 

Контрольные вопросы по теме «Классы»:

1. Что называется классом?

2. Синтаксис объявления класса.

3. Перечислить элементы класса.

4. Что определяет свойство класса.

5. Какие спецификаторы допускаются для не вложенных классов, которые описываются непосредственно в пространстве имен?

6. Какой спецификатор доступа подразумевается для этих классов по умолчанию?

7. С помощью какой операция создаётся экземпляр класса?

8. К каким типам данных относится класс?

9. Какие элементы классов присутствуют в единичном экземпляре в объекте класса?

10. Перечислите спецификаторы данных класса.

11. Какой спецификатор доступа элементов класса считается по умолчанию?

12. Имеют ли методы класса непосредственный доступ к его закрытым полям?

13. С помощью какой операции можно обратиться к полю класса?

14. Как обратиться к статическому полю класса и к константе?

15. Как обратиться к нестатическому элементу класса?

16. Для чего применяется параметр this в явном виде?

17. Для чего предназначен конструктор?

18. Перечислить свойства конструктора.

19. В каких случаях конструктор базового класса вызывается явным образом?

20. С помощью какого ключевого слова можно явным образом вызвать конструктор базового класса?

21. Для чего служит свойство класса?

22. Синтаксис объявления свойства.

23. Могут ли отсутствовать части get/set, или обе одновременно?

24. Когда свойство доступно только для чтения (read-only)?

25. Когда свойство доступно только для записи (write-only)?

26. Какие спецификаторы доступа можно задавать для частей свойства, объявленного со спецификатором public?

27. Какие спецификаторы доступа можно задавать для частей свойства, объявленного со спецификатором protected internal?