OVH Cloud OVH Cloud

opération dans le destructeur (~MaClasse)

1 réponse
Avatar
Cyrille37
Bonjour,

Dans le constructeur d'une classe, je fais quelques tests pour voir si to=
ut est bien ranger.
Le probl=E8me est que certains membres de cette classe semblent d=E9j=E0 =
=EAtre en cours de destruction.

Par exemple, il y a un membre qui me permet de g=E9rer des traces, c'est =
un membre static.
Dans le constructeur, d=E8s fois les traces sont effectu=E9es, d=E8s fois=
une exception est lev=E9e disant que le TextWriter=20
associ=E9 est ferm=E9.
J'en d=E9duit donc que la destruction des membres commence avant celle de=
la classe, et ceci en parall=E8le.

Avez vous des commentaires pour m'=E9clairer sur le sujet ?
Y a-t-il un moyen d'ex=E9cuter du code =E0 la destruction d'une classe av=
ant que ses membres ne commencent =E0 se d=E9truire ?

Merci d'avance,
cyrille

1 réponse

Avatar
Sylvain Lafontaine
Contrairement à C++, les destructeurs en C# ne sont pas déterministes; cela
autant dans le temps que dans l'ordre. Sauf peut-être pour libérer des
ressources externes à C# - tels que des handles de Windows - vous ne devriez
jamais utiliser des ressources internes à C# dans un destructeur ou faire
appel à d'autres objets référencés par un objet en cours de destruction.

Si vous voulez un ordre quelconque d'exécution une fois terminé l'usage d'un
objet, vous devez créer une fonction (probablement virtuelle) et l'appeler
avant de libérer celui-ci ou utiliser la méthode Dispose(true). Voir:

http://msdn.microsoft.com/msdnmag/issues/1100/GCI/default.aspx
http://msdn.microsoft.com/msdnmag/issues/1200/GCI2/default.aspx

http://www.martnet.com/~jfosler/articles/UsingDispose.htm

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconimplementingdisposemethod.asp.

L'article de Jeff Richter est un peu vieux et certaines choses dedans ne
sont plus bonnes car elles font référence à .NET 1.0 (il y a eu plusieurs
changements au niveau du GC pour .NET 1.1) mais l'idée générale est là.

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC
E-mail: http://cerbermail.com/?QugbLEWINF


"Cyrille37" wrote in message
news:%23$
Bonjour,

Dans le constructeur d'une classe, je fais quelques tests pour voir si tout
est bien ranger.
Le problème est que certains membres de cette classe semblent déjà être en
cours de destruction.

Par exemple, il y a un membre qui me permet de gérer des traces, c'est un
membre static.
Dans le constructeur, dès fois les traces sont effectuées, dès fois une
exception est levée disant que le TextWriter
associé est fermé.
J'en déduit donc que la destruction des membres commence avant celle de la
classe, et ceci en parallèle.

Avez vous des commentaires pour m'éclairer sur le sujet ?
Y a-t-il un moyen d'exécuter du code à la destruction d'une classe avant que
ses membres ne commencent à se détruire ?

Merci d'avance,
cyrille