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

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

От версии 1.1
отредактировано Alexandr Fokin
на 2023/02/15 22:49
Изменить комментарий: К данной версии нет комментариев
К версии 1.9
отредактировано Alexandr Fokin
на 2023/02/15 23:43
Изменить комментарий: К данной версии нет комментариев

Сводка

Подробности

Свойства страницы
Содержимое
... ... @@ -1,2 +1,90 @@
1 1  Реализация метода Dispose
2 2  [[https:~~/~~/learn.microsoft.com/ru-ru/dotnet/standard/garbage-collection/implementing-dispose>>https://learn.microsoft.com/ru-ru/dotnet/standard/garbage-collection/implementing-dispose]]
3 +
4 +----
5 +
6 +|(% style="width:465px" %)Отчистка неуправляемых и управляемых ресурсов|(% style="width:1030px" %){{code language="C#"}}class BaseClassWithFinalizer : IDisposable
7 +{
8 + // To detect redundant calls
9 + private bool _disposedValue;
10 +
11 + ~BaseClassWithFinalizer() => Dispose(false);
12 +
13 + // Public implementation of Dispose pattern callable by consumers.
14 + public void Dispose()
15 + {
16 + Dispose(true);
17 + GC.SuppressFinalize(this);
18 + }
19 +
20 + // Protected implementation of Dispose pattern.
21 + protected virtual void Dispose(bool disposing)
22 + {
23 + if (!_disposedValue)
24 + {
25 + if (disposing)
26 + {
27 + // TODO: dispose managed state (managed objects)
28 + }
29 +
30 + // TODO: free unmanaged resources (unmanaged objects) and override finalizer
31 + // TODO: set large fields to null
32 + _disposedValue = true;
33 + }
34 + }
35 +}{{/code}}
36 +|(% style="width:465px" %)Отчистка управляемых ресурсов
37 +(Соответственно не использует финализацию).|(% style="width:1030px" %){{code language="C#"}}public sealed class Foo : IDisposable
38 +{
39 + private readonly IDisposable _disposable1;
40 + private readonly IDisposable _disposable2;
41 +
42 + public Foo()
43 + {
44 + _disposable1 = new Bar();
45 + _disposable2 = new Bar();
46 + }
47 +
48 + public void Dispose()
49 + {
50 + _disposable1.Dispose();
51 + _disposable2.Dispose();
52 + }
53 +}{{/code}}
54 +|(% style="width:465px" %)Наследование. Отчистка неуправляемых и управляемых ресурсов.|(% style="width:1030px" %){{code language="C#"}}class DerivedClassWithFinalizer : BaseClassWithFinalizer
55 +{
56 + // To detect redundant calls
57 + private bool _disposedValue;
58 +
59 + ~DerivedClassWithFinalizer() => this.Dispose(false);
60 +
61 + // Protected implementation of Dispose pattern.
62 + protected override void Dispose(bool disposing)
63 + {
64 + if (!_disposedValue)
65 + {
66 + if (disposing)
67 + {
68 + // TODO: dispose managed state (managed objects).
69 + }
70 +
71 + // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
72 + // TODO: set large fields to null.
73 + _disposedValue = true;
74 + }
75 +
76 + // Call the base class implementation.
77 + base.Dispose(disposing);
78 + }
79 +}{{/code}}
80 +|(% style="width:465px" %)Пример использование механизма отчистки для воскрешения (resurrection) объекта.
81 +\\Можно доработать для использования Dispose (не подавляется финализация, не выполняется повторная регистрация).
82 +Если объект внутри себя использует другие финализируемые объекты, то внутри блока финализатора их состояние может быть недетерминировано (скорее всего их придется пересоздавать).|(% style="width:1030px" %){{code language="C#"}}class A {
83 + private IObjectPool _pool = ...;
84 +
85 + ~A() {
86 + //will not die. keep a reference in resurectedA.
87 + _pool.ReturnToPool(this);
88 + GC.ReRegisterForFinalize(this);
89 + }
90 +}{{/code}}