Изменения документа Dispose
Редактировал(а) Alexandr Fokin 2024/06/02 16:03
От версии 1.2
отредактировано Alexandr Fokin
на 2023/02/15 23:07
на 2023/02/15 23:07
Изменить комментарий:
К данной версии нет комментариев
К версии 1.6
отредактировано Alexandr Fokin
на 2023/02/15 23:40
на 2023/02/15 23:40
Изменить комментарий:
К данной версии нет комментариев
Сводка
-
Свойства страницы (1 изменено, 0 добавлено, 0 удалено)
Подробности
- Свойства страницы
-
- Содержимое
-
... ... @@ -33,7 +33,8 @@ 33 33 } 34 34 } 35 35 }{{/code}} 36 -|(% style="width:465px" %)Отчистка управляемых ресурсов|(% style="width:1030px" %){{code language="C#"}}public sealed class Foo : IDisposable 36 +|(% style="width:465px" %)Отчистка управляемых ресурсов 37 +(Соответственно не использует финализацию).|(% style="width:1030px" %){{code language="C#"}}public sealed class Foo : IDisposable 37 37 { 38 38 private readonly IDisposable _disposable1; 39 39 private readonly IDisposable _disposable2; ... ... @@ -40,14 +40,15 @@ 40 40 41 41 public Foo() 42 42 { 43 - _bar = new Bar(); 44 + _disposable1 = new Bar(); 45 + _disposable2 = new Bar(); 44 44 } 45 45 46 46 public void Dispose() 47 - { 48 - _disposable1.Dispose(); 49 - _disposable2.Dispose(); 50 - } 49 + { 50 + _disposable1.Dispose(); 51 + _disposable2.Dispose(); 52 + } 51 51 }{{/code}} 52 52 |(% style="width:465px" %)Наследование. Отчистка неуправляемых и управляемых ресурсов.|(% style="width:1030px" %){{code language="C#"}}class DerivedClassWithFinalizer : BaseClassWithFinalizer 53 53 { ... ... @@ -75,5 +75,14 @@ 75 75 base.Dispose(disposing); 76 76 } 77 77 }{{/code}} 80 +|(% style="width:465px" %)Пример использование механизма отчистки для воскрешения (resurrection) объекта. 81 +\\Можно доработать для использования Dispose (не подавляется финализация, не выполняется повторная регистрация). 82 +Если объект внутри себя использует другие финализируемые объекты, то внутри блока финализатор их состояние может быть недетерминировано.|(% style="width:1030px" %){{code language="C#"}}class A { 83 + private IObjectPool _pool = ...; 78 78 79 - 85 + ~A() { 86 + //will not die. keep a reference in resurectedA. 87 + _pool.ReturnToPool(this); 88 + GC.ReRegisterForFinalize(this); 89 + } 90 +}{{/code}}