4
4
// Created by: Alex Yakunin
5
5
// Created: 2007.12.29
6
6
7
- using System ;
8
- using System . Collections ;
9
- using System . Collections . Generic ;
10
- using System . Threading . Tasks ;
11
- using Xtensive . Core ;
12
-
13
-
14
7
namespace Xtensive . Core
15
8
{
16
9
/// <summary>
@@ -22,24 +15,23 @@ namespace Xtensive.Core
22
15
/// <see cref="IDisposable.Dispose"/> methods are invoked in backward order.
23
16
/// </note>
24
17
/// </remarks>
25
- public sealed class DisposableSet : IDisposable , IAsyncDisposable
18
+ internal sealed class DisposableSet ( ) : List < IDisposable > , IDisposable , IAsyncDisposable
26
19
{
27
20
private HashSet < IDisposable > set ;
28
- private List < IDisposable > list ;
29
21
30
22
/// <summary>
31
23
/// Adds an <see cref="IDisposable"/> object to the set.
32
24
/// </summary>
33
25
/// <param name="disposable">The object to add.</param>
34
26
/// <returns><see langword="True"/>, if object is successfully added;
35
27
/// otherwise, <see langword="false"/>.</returns>
36
- public bool Add ( IDisposable disposable )
28
+ public new bool Add ( IDisposable disposable )
37
29
{
38
30
if ( disposable == null )
39
31
return false ;
40
32
EnsureInitialized ( ) ;
41
33
if ( set . Add ( disposable ) ) {
42
- list . Add ( disposable ) ;
34
+ base . Add ( disposable ) ;
43
35
return true ;
44
36
}
45
37
return false ;
@@ -49,10 +41,10 @@ public bool Add(IDisposable disposable)
49
41
/// Clears this instance by discarding all registered objects.
50
42
/// <see cref="IDisposable.Dispose"/> methods are not called.
51
43
/// </summary>
52
- public void Clear ( )
44
+ public new void Clear ( )
53
45
{
54
46
set = null ;
55
- list = null ;
47
+ base . Clear ( ) ;
56
48
}
57
49
58
50
/// <summary>
@@ -69,32 +61,7 @@ public void Clear()
69
61
70
62
private void EnsureInitialized ( )
71
63
{
72
- if ( set == null ) {
73
- set = new HashSet < IDisposable > ( ) ;
74
- list = new List < IDisposable > ( ) ;
75
- }
76
- }
77
-
78
-
79
- // Constructors
80
-
81
- /// <summary>
82
- /// Initializes new instance of this type.
83
- /// </summary>
84
- /// <param name="initialContent">The initial content.</param>
85
- public DisposableSet ( IEnumerable initialContent )
86
- : this ( )
87
- {
88
- ArgumentNullException . ThrowIfNull ( initialContent ) ;
89
- foreach ( object o in initialContent )
90
- Add ( o as IDisposable ) ;
91
- }
92
-
93
- /// <summary>
94
- /// Initializes new instance of this type.
95
- /// </summary>
96
- public DisposableSet ( )
97
- {
64
+ set ??= new ( ) ;
98
65
}
99
66
100
67
/// <summary>
@@ -103,34 +70,33 @@ public DisposableSet()
103
70
void IDisposable . Dispose ( )
104
71
{
105
72
try {
106
- if ( list == null ) {
73
+ if ( Count == 0 ) {
107
74
return ;
108
75
}
109
76
110
77
using ( var aggregator = new ExceptionAggregator ( ) ) {
111
- for ( var i = list . Count - 1 ; i >= 0 ; i -- ) {
112
- aggregator . Execute ( d => d . Dispose ( ) , list [ i ] ) ;
78
+ for ( var i = Count - 1 ; i >= 0 ; i -- ) {
79
+ aggregator . Execute ( d => d . Dispose ( ) , this [ i ] ) ;
113
80
}
114
81
115
82
aggregator . Complete ( ) ;
116
83
}
117
84
}
118
85
finally {
119
- set = null ;
120
- list = null ;
86
+ Clear ( ) ;
121
87
}
122
88
}
123
89
124
90
async ValueTask IAsyncDisposable . DisposeAsync ( )
125
91
{
126
92
try {
127
- if ( list == null ) {
93
+ if ( Count == 0 ) {
128
94
return ;
129
95
}
130
96
131
97
using ( var aggregator = new ExceptionAggregator ( ) ) {
132
- for ( var i = list . Count - 1 ; i >= 0 ; i -- ) {
133
- var disposable = list [ i ] ;
98
+ for ( var i = Count - 1 ; i >= 0 ; i -- ) {
99
+ var disposable = this [ i ] ;
134
100
if ( disposable is IAsyncDisposable asyncDisposable ) {
135
101
await aggregator . ExecuteAsync ( d => d . DisposeAsync ( ) , asyncDisposable ) . ConfigureAwaitFalse ( ) ;
136
102
}
@@ -143,8 +109,7 @@ async ValueTask IAsyncDisposable.DisposeAsync()
143
109
}
144
110
}
145
111
finally {
146
- set = null ;
147
- list = null ;
112
+ Clear ( ) ;
148
113
}
149
114
}
150
115
}
0 commit comments