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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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:
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
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:
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" <cyrille37@nospam.net> wrote in message
news:%23$cDIva8FHA.3224@TK2MSFTNGP09.phx.gbl...
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 ?
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:
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 ?