Bonjour à tous,
Qu'entend-on nous par object non managé. Si j'ai créé une DLL en MFC et que j'y fasse appel avec des fonctions du genre Start et Stop.
Mettons que cette DLL fait que jouer un son wave dans un buffer static encapsulé dans la DLL.
Il est impératif que la méthode Stop soit appelée lors de la destruction de l'objet, aussi elle devrait l'être si l'utilisateur appel Dispose ou encore Stop.
De quelle façon doit-on implémenter le dispose à ce moment là ?
Façon #1
Façon #2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class MyMFCWrapper : IDisposable { [DllImport(DllPath, EntryPoint = "Start")] public static extern int MFCStart(); [DllImport(DllPath, EntryPoint = "Stop")] public static extern int MFCStart(); private bool disposed = false; public MyMFCWrapper () { ... } public int Start() { return MFCStart(); } public int Stop() { return MFCStop(); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { Stop(); } disposed = true; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } }
En fait ce qui me me mêle le plus, ce n'est pas de comprendre comment fonctionne le Dispose pattern mais plutôt de savoir QUAND exactement est-il préférable d'implémenter un finalizer (destructeur). On dit que c'est nécessaire lorsqu'on travail avec des ojbect NON-MANAGÉ. Dans ce cas-ci, cette DLL est bien un objet NON-MANAGÉ, cependant elle n'alloue pas vraiment de mémoire ?!?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 public class MyMFCWrapper : IDisposable { [DllImport(DllPath, EntryPoint = "Start")] public static extern int MFCStart(); [DllImport(DllPath, EntryPoint = "Stop")] public static extern int MFCStart(); private bool disposed = false; public MyMFCWrapper () { ... } public int Start() { return MFCStart(); } public int Stop() { return MFCStop(); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { .... } Stop(); disposed = true; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } ~ MyMFCWrapper() { Dispose(false); } }
PS : D'autant plus que j'ai lu à plusieurs reprise qu'implémenter un finializer inutilement peut entraîner des pertes de performances...
Je vous remerci d'avance pour votre aide.
Partager