L'un des principaux avantages du code géré est la gestion intégrée de la mémoire. Vous n'avez pas besoin de suivre les pointeurs, la taille des tampons, de libérer la mémoire avec laquelle vous avez terminé, etc. géré aspect le fait pour vous.
Alors pourquoi avons-nous un IDisposable
l'interface ? MSDN dit l'interface permet de traiter les ressources non gérées telles que les poignées de fenêtre, les fichiers, etc. Mais pourquoi me demander d'appeler explicitement l'interface Dispose
(ou utiliser la méthode Using
) ?
-
Pourquoi le CLR ne peut-il pas suivre le moment où l'objet sort du champ d'application et appeler
Dispose
automatiquement ?Public Function DoSomething() As String Dim reader As New StreamReader("myfile.txt") Dim txtFromFile As String = reader.ReadToEnd()
Return txtFromFile '<==== reader goes out of scope after this line, so call Dispose automatically
End Function
-
À tout le moins, pourquoi le ramasse-miettes ne finira-t-il pas par l'atteindre et par appeler
Dispose
?
Qu'est-ce qui me manque ?
EDIT
Plusieurs personnes (ici et dans d'autres réponses qui suggèrent Using
) ont suggéré que la collecte des déchets n'est pas suffisante parce que le GC ne fait qu'une partie du travail. éventuellement se charge de collecter les IDisposable
. Je ne comprends pas pourquoi cet argument fait la distinction entre une IDisposable
et tout autre objet en .NET. Et avant de dire IDisposable
sont plus gourmands en ressources :
- En MSDN ci-dessus dit
IDisposable
est destiné aux objets non gérés, quels que soient leurs besoins en ressources - J'ai vu des objets .NET très gourmands en ressources (que diriez-vous de System.Web.UI.Page o System.Data.Objects.ObjectContext ).