
- •1)Принципы ооп (инкапсуляция, наследование, полиморфизм)
- •Формы полиморфизма Edit
- •2)Структура программы на с#
- •3)Встроенные типы данных. Типы-значения и ссылочные типы, упаковка и распаковка
- •4)Переменные и их инициализация, область видимости и время жизни переменных Проект Variables
- •Синтаксис объявления
- •Время жизни и область видимости переменных
- •Глобальные переменные уровня модуля.
- •Константы
- •5)Арифметические операторы, логические операторы
- •6)Приоритет операций, преобразование типов в выражениях
- •7)Оператор присваивания
- •Составные операторы присваивания
- •8)Операторы условный и выбора
- •Оператор if
- •Оператор switch
- •9)Операторы цикла
- •Цикл for
- •Цикл while
- •Цикл do. . . While
- •Цикл foreach
- •10)Операторы перехода
- •Оператор goto
- •Оператор break
- •Оператор continue
- •Оператор return
- •11)Массивы, создание и инициализация массивов, ступенчатые массивы
- •Инициализация массива
- •Неявно типизированные массивы
- •Определение массива объектов
- •Свойство Length
- •Двумерные массивы
- •Массивы трех и более измерений
- •Инициализация многомерных массивов
- •Применение свойства Length при обращении со ступенчатыми массивами
- •12)Классы и объекты, элементы класса
- •Общая форма определения класса
- •Данные-члены
- •Функции-члены
- •Переменные ссылочного типа и присваивание
- •Инициализаторы объектов
- •Методы, статические методы, параметры методов
- •Объявление методов
- •Возврат из метода и возврат значения
- •Использование параметров
- •14)Перегрузка методов
- •15)Конструкторы
- •16)Сборка мусора и деструкторы
- •Деструкторы
- •17)Перегрузки операторов
- •Перегрузка бинарных операторов
- •Перегрузка унарных операторов
- •Выполнение операций со встроенными в с# типами данных
- •Перегрузка операторов отношения и операторов true - false
- •Перегрузка операторов отношения
- •Перегрузка операторов true и false
- •Перегрузка логических операторов
- •Перегрузка укороченных логических операторов
- •Свойства
- •Автоматически реализуемые свойства
- •19)Индексаторы
- •Одномерные индексаторы
- •Многомерные индексаторы
- •20)Основы наследования
- •21)Конструкторы и наследование
- •23)Виртуальные методы
Деструкторы
В языке С# имеется возможность определить метод, который будет вызываться непосредственно перед окончательным уничтожением объекта системой "сборки мусора". Такой метод называется деструктором и может использоваться в ряде особых случаев, чтобы гарантировать четкое окончание срока действия объекта. Например, деструктор может быть использован для гарантированного освобождения системного ресурса, задействованного освобождаемым объектом. Ниже приведена общая форма деструктора:
~имя_класса () {
// код деструктора
}
Следует, однако, иметь в виду, что деструктор вызывается непосредственно перед "сборкой мусора". Он не вызывается, например, в тот момент, когда переменная, содержащая ссылку на объект, оказывается за пределами области действия этого объекта. (В этом отношении деструкторы в С# отличаются от деструкторов в С++, где они вызываются в тот момент, когда объект оказывается за пределами области своего действия.) Это означает, что заранее нельзя знать, когда именно следует вызывать деструктор. Кроме того, программа может завершиться до того, как произойдет "сборка мусора", а следовательно, деструктор может быть вообще не вызван.
Давайте рассмотрим пример использования деструкторов:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class MyClass
{
int k;
public MyClass(int i)
{
k = i;
}
// Деструктор
~MyClass()
{
Console.WriteLine("Объект {0} уничтожен", k);
}
// Метод создающий и тут же уничтожающий объект
public void objectGenerator(int i)
{
MyClass ob = new MyClass(i);
}
}
class Program
{
static void Main()
{
int i = 1;
MyClass obj = new MyClass(0);
for (; i < 120000; i++)
{
obj.objectGenerator(i);
}
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("\nКонец");
Console.ReadLine();
}
}
}
В силу того что порядок вызова деструкторов не определен точно, их не следует применять для выполнения действий, которые должны происходить в определенный момент выполнения программы. В то же время имеется возможность запрашивать "сборку мусора". Тем не менее инициализация "сборки мусора" вручную в большинстве случаев не рекомендуется, поскольку это может привести к снижению эффективности программы. Кроме того, у системы "сборки мусора" имеются свои особенности — даже если запросить "сборку мусора" явным образом, все равно нельзя заранее знать, когда именно будет утилизирован конкретный объект.
Сборка мусора
Освобождение ранее выделенной динамической памяти во многих ЯП выполняется вручную.
Например, в С++ для этого используют оператор delete.
В C# для этих целей реализован поддерживаемый средой исполнения .NET механизм сборки мусора
суть механизма СМ (GC):
Когда в программе к объекту нет обращений (то есть исчезают ссылки на объект), то он рассматривается как более не использующийся (недоступный).
Система автоматически освобождает память, занимаемую более не использующимися объектами.
Освобожденная память может использоваться для хранения других объектов.
Сборка мусора осуществляется периодически в ходе выполнения программы.
Сборка мусора решает две основные задачи:
обнаруживает недоступные объекты и
восстанавливает занимаемую ими память.
Сборка мусора происходит в фоновом режиме в любой программе на C#, автоматически обнаруживая и удаляя все недоступные объекты.
НО такое удаление происходит не сразу.
Причина запаздывания – в экономии процессорного времени.
Но алгоритмы сборки мусора обеспечивают поддержку свободной памяти для размещения новых объектов.
Можно явно запустить сборку мусора, вызвав статический метод Collect класса System.GC:
System.GC.Collect();
Такой прием используется, чтобы
не тормозить работу программы в неподходящий момент,
когда сборка мусора может запуститься автоматически.
Для этого ее запускают заранее явным способом.
Ограниченные возможности деструкторов в C#
Итак, в C#, можно не заботиться об освобождении памяти при завершении работы с объектами.
НО предусмотрена возможность определения деструктора класса (любой класс имеет деструктор по умолчанию, даже если он не определен явно).
Синтаксис определения деструктора :
~class_name ( )
{
statements
}
!! отсутствует
тип возвращаемого результата (как и у конструктора!) и
уровень доступа.
Основное отличие деструктора C# от деструктора С++
в C# деструктор может быть вызван только при сборке мусора
в С++ деструктор вызывается при выходе за пределы области видимости, в которой был создан данный объект).
Поэтому невозможно точно определить, когда будет выполняться код деструктора.
Алгоритм использования деструкторов состоит из следующих шагов:
При сборке мусора различаются
объекты, содержащие явное объявление деструктора, и
объекты без таких объявлений.
При обнаружении недоступного объекта без деструктора он удаляется с высвобождением памяти.
При обнаружении объекта с деструктором ссылка на этот объект помещается в специальный список объектов, ожидающих выполнения их деструкторов.
По завершении поиска недоступных объектов выполняются коды деструкторов отобранных объектов.
Ссылки на объекты, для которых выполнились деструкторы, размещаются в списке объектов, подлежащих удалению, но само удаление происходит в следующем сеансе сборки мусора!
Выводы:
Порядок исполнения деструкторов неизвестен.
Когда будет вызван деструктор, неизвестно.
Неизвестно, будет ли деструктор вызван вообще.
Обработка объектов с деструкторами требует дополнительных ресурсов памяти и процессорного времени.
При этом объекты не только
занимают память,
но и могут содержать ссылки на другие объекты с деструкторами,
это, в свою очередь, задержит их уничтожение.
Вопрос:
есть ли ситуации, когда использование деструкторов оправданно?
Ответ:
их не так много:
деструктор может потребоваться для освобождения ресурсов, занятых объектом (например, запись данных в файл и/или его закрытие
деструктор позволяет узнать, когда же происходит сборка мусора.