Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

c# / C#. slsg 9. runkgtol o ztodyumltol uhglqyui

.pdf
Скачиваний:
36
Добавлен:
21.03.2016
Размер:
760 Кб
Скачать

Финальные действия различных объектов будут различными

Эти действия не могут определяться только сборщиком мусора

Все объекты в .NET Framework, начиная с класса Object, имеют метод Finalize

Напрямую вызывать метод Finalize или переопределять его нельзя

Деструктор – это то же самое, что и метод Finalize, но его уже можно переопределить

В C# для написания кода очистки данных используются деструкторы

При наличии деструктора он будет вызван сборщиком мусора перед очисткой памяти

Деструктор – это механизм очистки

Синтаксис деструкторов

Отсутствует модификатор доступа

Отсутствует возвращаемый тип данных, даже void

Имя совпадает с именем класса, перед которым стоит ~

Не имеет параметров

class TextFile

{

~TextFile( ) { ... }

}

Порядок время деструкции не определено

Необязательна полная противоположность конструктору

Гарантируется, что деструктор будет вызван

Нельзя рассчитывать на время вызова деструктора

Старайтесь по возможности избегать деструкторов

Они снижают производительность

Они усложняют программу

Они приводят к задержке при высвобождении ресурсов

Действия по очистке ресурса

Унаследуйте класс от интерфейса IDisposable и реализуйте метод Dispose, который будет очищать ресурсы

Внутри метода Dispose вызовите метод

GC.SuppressFinalize, что исключит вызов деструктора для данного объекта

Убедитесь, что при работе с объектом метод Dispose вызывается только один раз

Убедитесь, что объект после вызова Dispose больше не используется

http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

using System;

using System.ComponentModel;

public class DisposeExample

{

public class MyResource : IDisposable

{

private IntPtr handle;

private Component component = new Component(); private bool disposed = false;

public MyResource(IntPtr handle)

{

this.handle = handle;

}

public void Dispose()

{

Dispose(true);

GC.SuppressFinalize(this);

}

private void Dispose(bool disposing)

{

if (!this.disposed)

{

if (disposing)

{

component.Dispose();

}

CloseHandle(handle); handle = IntPtr.Zero;

disposed = true;

}

}

[System.Runtime.InteropServices.DllImport("Kernel32")] private extern static Boolean CloseHandle(IntPtr handle);

~MyResource()

{

Dispose(false);

}

}

public static void Main()

{

MyResource myResource = new MyResource(IntPtr.Zero); myResource.Dispose();

}

}

Синтаксис

using (Resource r = new Resource())

{

r.Method();

}

Метод Dispose автоматически вызывается в конце блока using

Эквивалентный пример

Resource r = new Resource(); try

{

r.Test();

}

finally

{

if (r != null) ((IDisposable)r).Dispose();

}

Спасибо за внимание!

Соседние файлы в папке c#