Bonjour,

J'aimerais juste revenir sur le comportement de la méthode Dispose pour confirmer que j'ai bien ou pas compris comment elle "fonctionne"

Tout d'abord, La méthode Dispose doit être overloadee en une méthode qui possède un paramètre de type booleen
pour prévoir les deux cas de figure :
-appel pour libérer des ressources managées( quand on veut les libérer plus tôt que prévu) en plus libération de ressources non managées:
dans ce cas le paramètre booléen possèdera la valeur true lors de l'appel de la méthode Dispose.

-appel pour libérer uniquement des ressources non managées dans un destructeur; dans ce cas le paramètre booléen aura pour valeur false.

Voici un exemple de code correspondant
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
 
class LogFileWriter:IDisposable{
 
private bool isdisposed = false;
private TextWriter writer =...;
private int largeArray[]=...;
 
public void WriteDatafile(..){
 
//on vérifie que l'objet courant n'a pas été libéré
 
if(isDisposed){throw new ObjectDisposedException();
.....//code de la méthode WriteDataFile
}
public void Dispose(){
Dispose(true);
GC.SuppressFinalizethis);
 
}
 
~ LogWriter(){
Dispose(false);
}
protected virtual Dispose(bool isdisposing){
//si l'objet n'a pas été libéré déjà
 
if(!isDisposed){
if(isDisposing){
 
//on libère les ressources managées
largeArray=null;
}//fin de if(isDisposing)
 
//on libère toujours les ressources non managées
if(writer!=null){
writer.Flush();
writer.Close();
writer=null;
}
//appel de la méthode Dispose parente
base.Dispose(isDisposing);
}//fin  méthode Dispose
 
}//fin de classe LogFileWriter
J'apprends que lorsque j'appelle la méthode Dispose avec pour paramètre la valeur true, je dois ajouter l'instruction
GC.SuppressFinalize(this);

Je voulais savoir: est ce que le fait d'avoir libéré des ressources managées( en leur affectant la valzur null par exemple), revient à "appeler" la méthode Finalize
pour ces objets et donc pour éviter de l'appeler à nouveau on ecrit cette instruction.

Par ailleurs, quand le destructeur d'un objet est executé, la méthode Finalize est redéfinie par le compilateur qui , en plus du code du destructeur , appelle la méthode Finalize de la classe Object.
Si dans le code du destructeur(de la méthode Dispose avec paramètre à false)il y a une instruction qui affecte la valeur null à l'objet qui doit être détruit(comme c'est le cas avec l'instruction writer=null,n'est-ce pas comme s'il y avait deux fois un appel à la méthode Finalize,


Je vous remercie beaucoup de votre aide sur ce point