
- •Роль инкапсуляции
- •Роль наследования
- •Роль полиморфизма
- •Конструкторы
- •Конструктор копирования
- •Деструкторы
- •Перегрузка методов
- •Перегрузка операторов
- •Перегрузка бинарных операторов
- •Перегрузка унарных операторов
- •Выполнение операций со встроенными в с# типами данных
- •Переопределение методов Перекрытие методов
- •Сокрытие методов
- •Вызов базовых версий методов
- •Область видимости переменных
- •Конфликты областей видимости локальных переменных
- •Конфликты областей видимости полей и локальных переменных
- •Константы
- •Модификаторы доступа
- •Пространства имен
- •Uml. Диаграмма вариантов использования. Привести пример.
- •Чтение схем вариантов использования
- •Субъекты, варианты использования и подсистемы
- •Структурирование вариантов использования
- •Количество элементов между субъектами и вариантами использования
- •Задание количества элементов в ассоциации
- •Uml. Диаграмма классов. Привести пример.
- •Типы атрибутов и операций
- •Несколько типов
- •Атрибуты и ассоциации
- •Обобщение
- •Реализация
- •Uml. Диаграмма последовательности. Привести пример.
- •Создание схемы последовательностей
- •Изменение порядка сообщений
- •Перемещение или копирование последовательностей сообщений на схеме последовательностей
- •Оптимизация размещения элементов на схеме последовательностей
- •Изменить пакет, владеющий взаимодействием
- •Типы сообщений
- •Создание заметок о взаимодействиях
- •Инициирующее событие
- •Уровень детализации
- •Uml. Диаграмма деятельности. Привести пример. Простые потоки управления
- •Параллельные потоки
- •Потоки данных
- •Основные этапы создания схем активности
- •Uml. Диаграмма кооперации. Привести пример.
- •Uml. Диаграмма состояний. Привести пример.
- •Понятие состояния объекта
- •Переход
- •Сложные переходы
- •Переходы между параллельными состояниями
- •Переходы между составными состояниями
- •Синхронизирующие состояния
- •Uml. Диаграмма компонентов. Диаграмма развертывания. Привести пример.
- •Структурный паттерн проектирования «Компоновщик». Привести пример.
- •Структурный паттерн проектирования «Оболочка». Привести пример.
- •Структурный паттерн проектирования «Мост». Привести пример.
- •Структурный паттерн проектирования «Адаптер». Привести пример.
- •Структурный паттерн проектирования «Заместитель». Привести пример.
- •Структурный паттерн проектирования «Приспособленец». Привести пример.
- •Поведенческий паттерн проектирования «Команда». Привести пример.
- •Поведенческий паттерн проектирования «Наблюдатель». Привести пример.
- •Поведенческий паттерн проектирования «Состояние». Привести пример.
- •Поведенческий паттерн проектирования «Итератор». Привести пример.
- •Поведенческий паттерн проектирования «Цепочка обязанностей». Привести пример.
- •Поведенческий паттерн проектирования «Шаблонный метод». Привести пример.
- •Порождающий паттерн проектирования «Абстрактная фабрика». Привести пример.
- •Порождающий паттерн проектирования «Абстрактный метод». Привести пример.
- •Порождающий паттерн проектирования «Одиночка». Привести пример.
- •Порождающий паттерн проектирования «Прототип». Привести пример.
- •Порождающий паттерн проектирования «Строитель». Привести пример
- •Архитектурный шаблон проектирование mvc. Привести пример. Введение
- •«Оригинальный» mvc
- •Model (Модель)
- •View (Представление)
- •Controller (Контроллер)
- •Недостатки mvc и Document-View
- •Почему интерфейс?
- •Отличия от mvc
- •Заключение
Деструкторы
Деструкторы очень редко используются в C#. Они являются методами, вызываемыми средой выполнения, когда объект нужно удалить из памяти. Деструкторы обычно применяются для правильной обработке ресурсов, которые должны быть высвобождены.
Деструкторы используются для уничтожения экземпляров классов.
Заметки
В структурах определение деструкторов невозможно. Они применяются только в классах.
Класс может иметь только один деструктор.
Деструкторы не могут наследоваться или перегружаться.
Деструкторы невозможно вызвать. Они запускаются автоматически.
Деструктор не принимает модификаторы и не имеет параметров.
Например, следующая инструкция является объявлением деструктора класса Car:
C#
class Car
{
~Car() // destructor
{
// cleanup statements...
}
}
Деструктор неявным образом вызывает метод Finalize для базового класса объекта. Следовательно, предыдущий код деструктора неявным образом преобразуется в следующий код:
protected override void Finalize()
{
try
{
// Cleanup statements...
}
finally
{
base.Finalize();
}
}
Это означает, что метод Finalize вызывается рекурсивно для всех экземпляров цепочки наследования начиная с самого дальнего и заканчивая самым первым.Примечание
Пустые деструкторы использовать не следует. Если класс содержит деструктор, то в очереди метода Finalize создается запись. При вызове деструктора вызывается сборщик мусора, выполняющий обработку очереди. Если деструктор пустой, это приводит только к ненужному снижению производительности.
Программист не может управлять моментом вызова деструктора, потому что момент вызова определяется сборщиком мусора. Сборщик мусора проверяет наличие объектов, которые больше не используются приложением. Если считает, что какой-либо объект требует уничтожения, то он вызывает деструктор (при наличии) и освобождает память, используемую для хранения этого объекта. Деструкторы также вызываются при выходе из программы.
Существует возможность принудительно выполнить сборку мусора, вызвав метод Collect, но в большинстве случаев этого следует избегать, потому что это может привести к проблемам с производительностью.
Использование деструкторов для освобождения ресурсов.
В целом, язык C# не требует управления памятью в той степени, в какой это требуется в случае разработки кода на языке, не рассчитанном на среду выполнения со сборкой мусора. Это связано с тем, что сборщик мусора платформы .NET Framework неявным образом управляет выделением и высвобождением памяти для объектов. Однако при инкапсуляции приложением неуправляемых ресурсов, например окон, файлов и сетевых подключений, для высвобождения этих ресурсов следует использовать деструкторы. Если объект требует уничтожения, то сборщик мусора запускает выполнение метода Finalize этого объекта.
Высвобождение ресурсов явным образом
В случае, когда приложением используется ценный внешний ресурс, также рекомендуется обеспечить способ высвобождения этого ресурса явным образом, прежде чем сборщик мусора освободит этот объект. Это выполняется путем реализации метода Dispose интерфейса IDisposable, который выполняет необходимую очистку для объекта. Это может значительно повысить производительность приложения. Даже в случае использования данного явного управления ресурсами деструктор становится резервным средством очистки ресурсов, если вызов метода Dispose не будет выполнен.
Дополнительные сведения об очистке ресурсов см. в следующих разделах:
Очистка неуправляемых ресурсов
Реализация метода Dispose
Оператор using (Справочник по C#)
Пример
В следующем примере создаются три класса, образующих цепочку наследования. Класс First является базовым, класс Second является производным от класса First, а класс Third является производным от класса Second. Все три класса имеют деструкторы. В методе Main() создается экземпляр самого дальнего в цепочке наследования класса. При выполнении программы обратите внимание, что происходит автоматический вызов деструкторов всех трех классов по порядку от самого дальнего до первого в цепочке наследования.
C#
class First
{
~First()
{
System.Diagnostics.Trace.WriteLine("First's destructor is called.");
}
}
class Second : First
{
~Second()
{
System.Diagnostics.Trace.WriteLine("Second's destructor is called.");
}
}
class Third : Second
{
~Third()
{
System.Diagnostics.Trace.WriteLine("Third's destructor is called.");
}
}
class TestDestructors
{
static void Main()
{
Third t = new Third();
}
}
/* Output (to VS Output Window):
Third's destructor is called.
Second's destructor is called.
First's destructor is called.
*/
Перегрузка и переопределение методов и операторов. Привести примеры кода на одном из объектно-ориентированных языков C++,JavaилиC#.