Изменения документа Dispose

Редактировал(а) Alexandr Fokin 2024/06/02 16:03

От версии 1.2
отредактировано Alexandr Fokin
на 2023/02/15 23:07
Изменить комментарий: К данной версии нет комментариев
К версии 1.7
отредактировано Alexandr Fokin
на 2023/02/15 23:41
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -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}}