32 votes

Dois-je éliminer manuellement le socket après l'avoir fermé ?

Dois-je quand même appeler Dispose() sur ma prise après le fermer ?

Par exemple :

mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?

Je me demandais parce que la documentation MSDN dit ce qui suit :

Ferme la connexion Socket et libère toutes les ressources associées.

40voto

Mark Byers Points 318575

L'appel de Close appelle Dispose en interne, il n'est donc pas nécessaire d'appeler les deux. À partir de .NET Reflector :

public void Close()
{
    if (s_LoggingEnabled)
    {
        Logging.Enter(Logging.Sockets, this, "Close", (string) null);
    }
    ((IDisposable)this).Dispose();
    if (s_LoggingEnabled)
    {
        Logging.Exit(Logging.Sockets, this, "Close", (string) null);
    }
}

Dans la mesure du possible, vous devez utiliser le using afin de toujours appeler Dispose, quelles que soient les exceptions qui peuvent se produire.

21voto

Alex Reitbort Points 9120

Fermer et Disposer sont les mêmes dans ce cas. Lorsque Ms a introduit le motif Dispose dans .Net 1, le mot Dispose n'était pas très facile à trouver. La ligne directrice était donc d'ajouter un mot-clé spécifique au contexte qui fera la même fonctionnalité et sera plus facile à découvrir par les utilisateurs. Comme Close pour les fichiers et les sockets.

6voto

Erv Walter Points 6756

Par convention, vous devez toujours appeler Dispose sur tout ce qui implémente IDisposable. On ne sait jamais ce qu'il peut faire d'autre que ce qui est évident.

Et si vous utilisez Reflector pour constater qu'en fait, il n'est pas nécessaire actuellement, vous ne devez pas supposer que l'implémentation interne peut changer à un moment donné.

Ça ne fait jamais de mal d'appeler Dispose. Faites-le :)

2voto

Andy Points 476

La fermeture des objets IDisposable est généralement considérée comme une bonne pratique par beaucoup, car elle rend le code plus clair. Cependant, l'appel explicite à Dispose se fait automatiquement si vous encapsulez l'utilisation de l'IDisposable dans une déclaration using, comme par exemple cette page décrit.

0voto

Walt Stoneburner Points 1112

Laissez .NET invoquer la disposition :

using ( Socket mySocket = new Socket( ... ) ) {
  // Do stuff with socket, then bring it down nicely
}  // Dispose gets called returning the unmanaged system resources

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X