Скачиваний:
2
Добавлен:
04.09.2023
Размер:
1.17 Mб
Скачать

19 Создание объекта класса.

Создание объекта класса с помощью оператора «new». Инициализация данных класса. Конструкторы.

Класс представляет новый тип, который определяется пользователем. После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса.

Класс может хранить некоторые данные. Для хранения данных в классе применяются поля (переменные, определенные на уровне класса).

Кроме того, класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.

class Класс

{

private ТипПеременной Поле1; // private – внутренняя переменная

public ТипПеременной Поле2; // public – общая переменная

public ТипПеременной Поле3 = ЗначениеПоУмолчанию;

public void Метод() // Метод void не возвращает переменные

{

Оператор1(Поле2);

Оператор2();

}

public Класс (ТипПеременной Параметр1, ТипПеременной Парметр2) // Конструктор класса

{

Поле1 = Параметр1;

Оператор2();

}

}

После определения класса мы можем создавать его объекты. Для создания объекта применяются конструкторы. По сути конструкторы представляют специальные методы, которые называются так же как и класс, и которые вызываются при создании нового объекта класса и выполняют инициализацию объекта. Общий синтаксис вызова конструктора:

Класс Объект = new Класс(ПараметрыКонструктора);

Если в классе не определено ни одного, то для этого класса автоматически создается пустой конструктор по умолчанию, который не принимает никаких параметров.

Для обращения к функциональности класса - полям, методам (а также другим элементам класса) применяется точечная нотация точки - после объекта класса ставится точка, а затем элемент класса:

Объект.ПолеКласса

Объект.МетодКласса(ПараметрыМетода)

20 Деструкторы и «сборка мусора». Оператор «new». Резервирование и освобождение памяти. Деструкторы и «сборка мусора».

В программах на C# память для объектов нужно выделять динамически. Динамическое выделение памяти для объектов или других видов данных реализуется с помощью оператора new (просим программу выделить нам память, например, для переменной). Общая форма оператора new:

new ClassName(parameters_list)

где ClassName – имя класса, для объекта которого выделяется память;

parameter_list – список параметров, которые принимает один из конструкторов класса. Обязательно, в классе должен быть реализован конструктор, параметры которого совпадают с parameter_list. Конструктор может быть без параметров (конструктор по умолчанию).

После того, как объект выполнил свою работу, он (возможно) уже не используется в программе (но память все еще занимает). Если в программе создано много объектов классов, то может возникнуть ситуация, когда выделенной памяти не хватит для создания следующего объекта.

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

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

Если использованный объект становится ненужным, то выделенная для него память может быть освобождена не сразу, а позднее. В системе динамического управления памятью C# «сборка мусора» происходит только время от времени во время выполнения программы. «Сборка мусора» может не происходить если есть небольшое количество неиспользуемых объектов.

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

Общая форма деструктора имеет вид:

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

{

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

}

где имя_класса – имя конкретного класса.

У деструктора отсутствует тип, который возвращается и список параметров.

В C# явно вызвать деструктор не получится, потому что на это нет специального оператора. Например, в языке C++ для этих целей используется оператор delete, который в языке C# не используется. Но в C++ не реализована система «сборки мусора».

Однако, деструктор автоматически вызывается системой «сборки мусора» перед уничтожением памяти под объект его класса.

Пример. В примере объявляется класс MyClass, в котором реализован деструктор ~MyClass().

// пример класса, в котором реализован деструктор

class MyClass

{

int[] A; // внутренний массив A

// конструктор класса

public MyClass()

{

// выделение памяти для массива A

A = new int[100];

}

// деструктор класса

~MyClass()

{

// действия, которые необходимо выполнить, если произойдет "сборка мусора",

// и может быть вызван деструктор

// ...

}

}