Bonjour,


Les ressources managées ne nécessitent normalement pas d'être libérées manuellement, c'est le GC qui s'en occupe automatiquement.
La méthode Dispose() de l'interface IDisposable : elle est appelée normalement pour libérer les ressources non managées.

Mais il est possible de forcer la libération de ressources managées en appelant la méthode Dispose();dans ce cas , on appelle à l'intérieur de la méthode Dispose une méthode surchargée de la méthode Dispose qui possède en paramètre la valeur true
D'après le code suivant(les ...indiquent qu'il y a du code qu'il n'est pas nécessaire de connaître)

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

Le paramètre isDisposing de l'appel de la méthode Dispose pour la classe parente peut valoir true ou false: s'il est à true on disposera des ressources managées et non managées de la classe parente ,s'il est à false on ne disposera que des ressources non managées de cette classe.

La valeur du paramètre isDisposing est imposée par l'appel de la méthode Dispose que je ferai dans la classe LogFileWriter(qui est donc la classe fille) .

Qu'est ce qui me dit que dans la classe parente il existe également des ressources managées et non managées pour que je puisse appeler la méthode Dispose avec le paramètre true.

De plus, je ne suis pas censée savoir comment est définie la méthode Dispose de la classe parente et je ne comprends pas pourquoi le paramètre true convient alors.
Est-ce parce que c'est un formalisme?Si isDisposing vaut true, c'est que l'on souhaite disposer des ressources managées et non managées?

Autre point, normalement tous les champs et méthodes d'une classe parente sont héritées par la classe fille, donc normalement quand on appelle la méthode Dispose pour une classe fille, on libère en même temps toutes les ressources héritées de la classe Parente.


Pourquoi alors avoir besoin de libérer explicitement les ressources de la classe parente une fois supplémentaire par l'appel de la méthode Dispose?(base.Dispose(isDisposing)


Pour finir, pouvez-vous m'indiquer une raison qui justifie la présence d'un destructeur alors que les solutions suivantes existent qui permettent également de disposer des ressources non managées
-appeler la méthode Dispose avec le paramètre isDisposing à true, je libère ainsi les ressources managées et non managées.
-créer une méthode Dispose sans paramètres qui ne disposerait que des ressources non managées

Vous remerciant beaucoup de vos réponses sur ces points,

Cordialement.
new_wave