
- •Программирование на c#
- •Cанкт-Петербург
- •Лабораторная работа 1: Создание простой c#-программы Упражнение 1: Создание простой c#-программы
- •Упражнение 2: Компиляция и запуск c#-программы из командной строки
- •Упражнение 3: Использование отладчика Visual Studio .Net
- •Упражнение 4: Добавление в c#-программу обработчика исключительных ситуаций
- •Лабораторная работа 2: Создание и использование размерных типов данных Упражнение 1. Создание перечисления.
- •Упражнение 2. Создание и использование структуры
- •Упражнение 3. Добавление возможности ввода/вывода
- •Лабораторная работа 3.1: Использование выражений Упражнение 1. Преобразование дня года в дату типа месяц- день
- •Лабораторная работа 3.2: Использование исключений Упражнение 1. Проверка вводимого пользователем значения дня года
- •Упражнение 2. Учет високосных годов
- •Лабораторная работа 4: Создание и использование методов Упражнение 1. Использование параметров в методах, возвращающих значения
- •Упражнение 2. Использование в методах параметров, передаваемых по ссылке
- •Упражнение 3. Использование возвращаемых параметров в методах
- •Лабораторная работа 5: Создание и использование массивов Упражнение 1. Работа с массивами размерных типов.
- •Упражнение 2. Перемножение матриц
- •Лабораторная работа 6: Создание и использование классов Упражнение 1. Создание и использование класса
- •Упражнение 2. Генерация номеров банковских счетов
- •Упражнение 3. Добавление дополнительных public методов
- •Лабораторная работа 7.1: Создание и использование ссылочных переменных
- •Упражнение 2. Обращение строки
- •Упражнение 3. Создание прописной версии текста файла.
- •Лабораторная работа 7.2: Приведение типов Упражнение 1. Проверка наличия реализации интерфейса.
- •Упражнение 2. Работа с интерфейсами.
- •Лабораторная работа 8.1: Создание объектов Упражнение 1. Разработка конструкторов.
- •Упражнение 2. Инициализация данных только для чтения.
- •Лабораторная работа 8.2: Управление ресурсами Упражнение 1. Использование шаблона для удаления объектов
- •Лабораторная работа 9: Использование наследования при реализации интерфейсов Упражнение 1. Преобразование исходного файла на c# в файл html
- •Упражнение 2. Преобразование исходного файла на c# в файл html
- •Лабораторная работа 10.1: Использование модификатора доступа internal Упражнение 1. Создание банка.
- •Лабораторная работа 10.2: Создание пространств имен и сборок Упражнение 1. Организация классов
- •Лабораторная работа 11.1: Перегрузка операторов Упражнение 1 Перегрузка операторов для класса BankAccount.
- •Лабораторная работа 11.2: Определение и использование событий Упражнение 1. Ревизия банковских транзакций.
- •Лабораторная работа 12: Использование свойств и индексаторов Упражнение 1. Изменение класса BankAccount.
- •Упражнение 2. Изменение класса BankTransaction.
- •Упражнение 3. Создание и использование индексатора.
- •Лабораторная работа 13: Создание и использование атрибутов Упражнение 1. Использование атрибута Conditional
- •Упражнение 2. Создание и использование пользовательского атрибута
- •Литература
- •Приложение
- •Шаблон реализации iDisposable.
Шаблон реализации iDisposable.
Ниже будет представлен шаблон (пример) реализации поддержки интерфейса IDisposable, для объекта, поддерживающего детерминистическое уничтожение. К подобным классам предъявляются серьезные требования.
При вызове любых операций они обязаны отслеживать, находиться ли объект в рабочем состоянии или уже был деинициализирован при помощи метода Dispose.
Необходимо предусмотреть автоматическую деинициализацию объекта из финализатора, на тот случай, если программист забудет обратиться к методу Dispose или в силу некоторых причин сочтет это ненужным. Также необходимо учесть то, что при вызове финализатора объект уже может быть деинициализирован.
//Объект, поддерживающий модель детерминированного уничтожения
public class BaseResource: IDisposable
{
// Некоторый объект операционной системы,
//требующий своего закрытия после уничтожения.
private IntPtr handle;
// Управляемые ресурсы среды .NET
private Component Components;
// Специальный внутренний флаг, определяющий была ли произведена //деинициализация объекта
private bool disposed = false;
// Конструктор данного класса
public BaseResource( )
{
//Здесь будет размещаться инициализирующий код объекта
}
// Опишем метод Dispose интерфейса IDisposable.
// Не делайте этот метод виртуальным,
//чтобы потомки не смогли перекрыть его
public void Dispose( )
{
Dispose(true);
// Предотвращает автоматический вызов Finalize
// при сборке мусора, чтобы метод Dispose не был вызван повторно.
GC.SuppressFinalize(this);
}
//Данный метод специально объявлен виртуальным, т.к. он собственно
// и занимается реальным освобождением ресурсов.
protected virtual void Dispose(bool disposing)
{
// Проверим, вызвался ли метод ранее.
//Это всего лишь предеосторожность, чтобы не получить ошибку
//при повторном вызове метода Dispose.
//Т.е. проверим, в каком состоянии находится наш объект в текущий //момент.
if(!this.disposed)
{ // Если параметр, переданный методу=true,
//то освобождаем управляемые ресурсы, т.к. настоящий деструктор //никогда не вызовется, поскольку мы подавили его при
//помощи GC.SuppressFinalize(this);
if(disposing)
{
//Освобождаем управляемые ресурсы.
Components.Dispose( );
}
// Устанавливаем флаг, говорящий о том, что ресурсы уже //освобождены и объект более не доступен
this.disposed = true;
// Теперь освобождаем неуправляеиые ресурсы (уровня //операционной системы), к примеру вызовем Release.
Release(handle);
handle = IntPtr.Zero;
}
}
// Объявим финализатор, который будет вызван только в том случае, если до //этого не был вызван метод Dispose
~BaseResource( )
{
//В самом деструкторе не стоит очищать ресурсы, вместо этого лучше //центализованно поместить весь код очистки в метод Dispose. //Вызываем Dispose с параметром false, который говорит о отм, что //нужно очистить только неуправляемые ресурсы.
Dispose(false);
}
// Некоторый метод, который производит некоторую операцию, предоставляемую //классом.
public void DoSomething( )
{
//Проверяем, не был ли удален наш объект
if(this.disposed)
{
//Если объекта больше не существует, выбрасываем //соответствующее исключение
throw new ObjectDisposedException(...);
}
// Здесь выполняется соответствующая операция.
}
}