Изменения документа Dispose
Редактировал(а) Alexandr Fokin 2024/06/02 16:03
От версии 1.3
отредактировано Alexandr Fokin
на 2023/02/15 23:08
на 2023/02/15 23:08
Изменить комментарий:
К данной версии нет комментариев
К версии 1.9
отредактировано Alexandr Fokin
на 2023/02/15 23:43
на 2023/02/15 23:43
Изменить комментарий:
К данной версии нет комментариев
Сводка
-
Свойства страницы (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; ... ... @@ -45,10 +45,10 @@ 45 45 } 46 46 47 47 public void Dispose() 48 - { 49 - _disposable1.Dispose(); 50 - _disposable2.Dispose(); 51 - } 49 + { 50 + _disposable1.Dispose(); 51 + _disposable2.Dispose(); 52 + } 52 52 }{{/code}} 53 53 |(% style="width:465px" %)Наследование. Отчистка неуправляемых и управляемых ресурсов.|(% style="width:1030px" %){{code language="C#"}}class DerivedClassWithFinalizer : BaseClassWithFinalizer 54 54 { ... ... @@ -76,4 +76,14 @@ 76 76 base.Dispose(disposing); 77 77 } 78 78 }{{/code}} 80 +|(% style="width:465px" %)Пример использование механизма отчистки для воскрешения (resurrection) объекта. 81 +\\Можно доработать для использования Dispose (не подавляется финализация, не выполняется повторная регистрация). 82 +Если объект внутри себя использует другие финализируемые объекты, то внутри блока финализатора их состояние может быть недетерминировано (скорее всего их придется пересоздавать).|(% style="width:1030px" %){{code language="C#"}}class A { 83 + private IObjectPool _pool = ...; 79 79 85 + ~A() { 86 + //will not die. keep a reference in resurectedA. 87 + _pool.ReturnToPool(this); 88 + GC.ReRegisterForFinalize(this); 89 + } 90 +}{{/code}}