Читайте также: |
|
Нами рассмотрены два различных подхода, которые можно применять для создания класса, способного производить очистку и освобождать внутренние неуправляемые ресурсы.
Первый подход заключается в переопределении метода System.Object.Finalize() и позволяет гарантировать то, что объект будет очищать себя сам во время процесса сборки мусора (когда бы тот не запускался) без вмешательства со стороны пользователя.
Второй подход предусматривает реализацию интерфейса IDisposable и позволяет обеспечить пользователя объекта возможностью очищать объект сразу же по окончании работы с ним. Однако если пользователь забудет вызвать метод Dispose(), неуправляемые ресурсы могут оставаться в памяти на неопределенный срок.
Оба подхода можно комбинировать и применять вместе в определении одного класса, получая преимущества от обеих моделей.
Если пользователь объекта не забыл вызвать метод Dispose(), можно проинформировать сборщик мусора о пропуске финализации, вызвав метод GC.SuppressFinalize().
Если же пользователь забыл вызвать этот метод, объект рано или поздно будет подвергнут финализации и получит возможность освободить внутренние ресурсы. Преимущество такого подхода в том, что при этом внутренние ресурсы будут так или иначе, но всегда освобождаться.
Ниже приведена очередная версия класса MyResourceWrapper, которая теперь предусматривает выполнение и финализации и освобождения и содержится внутри проекта типа ConsoleApplication по имени FinalizableDisposableClass.
// Сложный упаковщик ресурсов.
public class MyResourceWrapper: IDisposable
{
// Сборщик мусора будет вызывать этот метод, если
// пользователь объекта забыл вызвать метод Dispose ().
~ MyResourceWrapper ()
{
// Освобождение любых внутренних неуправляемых
// ресурсов. Метод Dispose () HE должен вызываться
//ни для каких управляемых объектов.
}
// Пользователь объекта будет вызывать этот метод для
// того, чтобы освободить ресурсы как можно быстрее.
Дата добавления: 2015-07-25; просмотров: 62 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Public enum GCCollectionMode | | | Формализованный шаблон очистки |