Définition des objets sur Null/Nothing après utilisation dans .NET

Devez-vous définir tous les objets sur null (Nothing dans VB.NET) une fois que vous en avez terminé ?

Je comprends que dans .NET, il est essentiel de disposer de toutes les instances d'objets qui implémentent l'interface IDisposable pour libérer certaines ressources bien que l'objet puisse toujours être quelque chose après sa suppression (d'où le < code>4 dans les formulaires), donc je suppose qu'elle peut toujours résider en mémoire ou au moins en partie ?

Je sais aussi que lorsqu'un objet sort de la portée, il est alors marqué pour la collecte, prêt pour le prochain passage du ramasse-miettes (bien que cela puisse prendre du temps).

Donc, avec cela à l'esprit, le régler sur null accélérera le système libérant la mémoire car il n'a pas à comprendre qu'il n'est plus dans la portée et y a-t-il des effets secondaires néfastes ?

Les articles MSDN ne le font jamais dans les exemples et actuellement je le fais car je ne peux pas voir le mal. Cependant, j'ai rencontré un mélange d'opinions, donc tout commentaire est utile.

请先 登录 后评论

5 réponses

GateKiller

Certains objets supposent la méthode .dispose() qui force la ressource à être supprimée de la mémoire.

请先 登录 后评论
Bob

La seule fois où vous devez définir une variable sur null est lorsque la variable ne sort pas de la portée et que vous n'avez plus besoin des données qui lui sont associées. Sinon, ce n'est pas nécessaire.

请先 登录 后评论
Steve Tranby

Aussi :

using(SomeObject object = new SomeObject()) 
{
  // do stuff with the object
}
// the object will be disposed of
请先 登录 后评论
Patrick

Dans certains cas, il est logique d'utiliser des références nulles. Par exemple, lorsque vous écrivez une collection - comme une file d'attente prioritaire - et selon votre contrat, vous ne devriez pas garder ces objets en vie pour le client après que le client les a supprimés de la file d'attente.

Mais ce genre de chose n'a d'importance que dans les collections à longue durée de vie. Si la file d'attente ne survit pas à la fin de la fonction dans laquelle elle a été créée, cela a beaucoup moins d'importance.

Dans l'ensemble, vous ne devriez vraiment pas vous embêter. Laissez le compilateur et GC faire leur travail pour que vous puissiez faire le vôtre.

请先 登录 后评论
dbkk

En général, il n'est pas nécessaire d'annuler les objets après utilisation, mais dans certains cas, je trouve que c'est une bonne pratique.

Si un objet implémente IDisposable et est stocké dans un champ, je pense qu'il est bon de le mettre à zéro, juste pour éviter d'utiliser l'objet disposé. Les bugs du type suivant peuvent être pénibles :

this.myField.Dispose();
// ... at some later time
this.myField.DoSomething();

C'est bien d'annuler le champ après l'avoir supprimé, et d'obtenir un NullPtrEx juste à la ligne où le champ est à nouveau utilisé. Sinon, vous pourriez rencontrer un bogue énigmatique sur toute la ligne (en fonction de ce que fait exactement DoSomething).

请先 登录 后评论
  • 30 abonnés
  • 0 favoris,403 Feuilleter
  • John posée à 2023-03-03 22:03