Les réponses à cette question ont obtenu plus que un peu confus.
Le titre de la demande au sujet de l'élimination, mais alors dit qu'ils veulent de la mémoire de revenir immédiatement.
.Net est géré, ce qui signifie que lorsque vous écrivez .Net applications que vous n'avez pas besoin de vous soucier de la mémoire directement, le coût, c'est que vous n'avez pas de contrôle direct sur la mémoire soit.
.Net qui décide du moment où il est préférable de nettoyer et libérer de la mémoire, de ne pas vous le .Net codeur.
L' Dispose
est une façon de dire .Net que vous avez terminé avec quelque chose, mais il ne sera pas effectivement libérer de la mémoire jusqu'à ce qu'il est le meilleur moment pour le faire.
Fondamentalement .Net la collecte de la mémoire quand il est plus facile pour lui de le faire - c'est très bon à décider quand. Sauf si vous écrivez quelque chose de très gourmands en mémoire que vous n'avez normalement pas besoin de passer outre (c'est en partie pourquoi les jeux ne sont pas souvent dans les .Net encore: ils ont besoin d'un contrôle complet)
Dans .Net, vous pouvez utiliser GC.Collect()
pour le forcer à immédiatement, mais qui est presque toujours une mauvaise pratique. Si .Net n'a pas nettoyé, mais cela signifie qu'il n'est pas particulièrement bon temps pour elle de le faire.
GC.Collect()
ramasse les objets .Net identifie comme avec. Si vous n'avez pas disposé d'un objet qui en a besoin .Net peut décider de garder l'objet. Cela signifie qu' GC.Collect()
n'est efficace que si vous avez correctement mettre en œuvre votre jetables instances.
GC.Collect()
est pas un remplacement pour correctement à l'aide de IDisposable.
Donc en Disposer et la mémoire ne sont pas directement liés, mais ils n'ont pas besoin de l'être. Correctement l'élimination fera de votre .Net applications plus efficace et donc d'utiliser moins de mémoire mais.
99% du temps .Net voici les meilleures pratiques:
Règle 1: Si vous ne travaillez pas avec n'importe quoi non gérés ou qui implémente IDisposable
alors ne vous inquiétez pas à propos de les Éliminer.
Règle 2: Si vous avez une variable locale qui implémente IDisposable assurez-vous que vous en débarrasser dans le champ d'application actuel:
//using is best practice
using( SqlConnection con = new SqlConnection("my con str" ) )
{
//do stuff
}
//this is what 'using' actually compiles to:
SqlConnection con = new SqlConnection("my con str" ) ;
try
{
//do stuff
}
finally
{
con.Dispose();
}
Règle 3: Si une classe possède une propriété ou d'une variable de membre qui met en œuvre IDisposable alors que la classe doit implémenter IDisposable trop. Dans cette classe, la méthode dispose vous pouvez également vous débarrasser de vos IDisposable propriétés:
//rather basic example
public sealed MyClass :
IDisposable
{
//this connection is disposable
public SqlConnection MyConnection { get; set; }
//make sure this gets rid of it too
public Dispose()
{
//if we still have a connection dispose it
if( MyConnection != null )
MyConnection.Dispose();
//note that the connection might have already been disposed
//always write disposals so that they can be called again
}
}
Ce n'est pas vraiment complet, c'est pourquoi l'exemple est scellé. Héritant des classes peuvent avoir besoin pour observer la règle suivante...
Règle 4: Si une classe utilise une non géré ressources puis de mettre en œuvre IDispose et ajouter un finaliser.
.Net ne peut pas faire n'importe quoi avec la non managé des ressources, de sorte que maintenant nous parlons de la mémoire. Si vous n'avez pas le nettoyer, vous pouvez obtenir une fuite de mémoire.
La méthode dispose a besoin pour traiter aussi bien gérés et non gérés ressources.
Le finaliser est un cran de sécurité - il s'assure que si quelqu'un d'autre crée et de l'instance de votre classe et ne parvient pas à éliminer le "dangereux" non géré les ressources peuvent encore être nettoyé par .Net.
~MyClass()
{
//calls a protected method
//the false tells this method
//not to bother with managed
//resources
this.Dispose(false);
}
public void Dispose()
{
//calls the same method
//passed true to tell it to
//clean up managed and unmanaged
this.Dispose(true);
//as dispose has been correctly
//called we don't need the
//'backup' finaliser
GC.SuppressFinalize(this);
}
Enfin, cette surcharge de Disposer que prend un drapeau booléen:
protected virtual void Dispose(bool disposing)
{
//check this hasn't been called already
//remember that Dispose can be called again
if (!disposed)
{
//this is passed true in the regular Dispose
if (disposing)
{
// Dispose managed resources here.
}
//both regular Dispose and the finaliser
//will hit this code
// Dispose unmanaged resources here.
}
disposed = true;
}
Notez qu'une fois que tout ceci est en place autre code géré la création d'une instance de votre classe peut juste le traiter comme n'importe quel autre IDisposable (Règles 2 et 3).