2010-08-30 10 views

Respuesta

35

Llamar Cerrar llamadas internas Eliminar, por lo que no necesita llamar a ambos. 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); 
    } 
} 

Si es posible se debe utilizar el patrón using para que siempre llama a botar con independencia de las excepciones que pudieran ocurrir.

+2

Thnx para el dasm, pero esto es muy extraño. MSDN dice que Close() es una forma buena y legítima de abortar una operación asíncrona como BeginReceive(), y luego EndReceive devolvería el error "objeto eliminado". ¿Alguna idea de cómo se supone que funciona? –

+0

http://stackoverflow.com/questions/4662553/how-to-abort-sockets-beginreceive/4662631#4662631 –

+0

¿Qué puede decir acerca de IP inalcanzable? @Mark Byers https://stackoverflow.com/questions/44694061/udpclient-unreachable-ip-connection-time-with-using-blocks –

6

Por convención, siempre debe llamar a Dispose en cualquier cosa que implemente IDisposable. Nunca se sabe qué otras cosas podría hacer más allá de lo obvio.

Y si utiliza Reflector para ver que, de hecho, actualmente no es necesario, no debe suponer que la implementación interna puede cambiar en algún momento.

Nunca duele llamar a Dispose. Simplemente hazlo :)

+0

No DAÑA llamar a Dispose, pero no es necesario si lo haces re usando la construcción "usar" apropiadamente; se hace automáticamente El constructo "using" en realidad se compila en un "try ... finally", y Dispose se llama dentro de "finally". – Andy

+3

Tiene razón. No lo he deletreado, pero "using construct" = calling Dispose. Siempre que se llame a Dispose.En el caso específico enumerado, a menudo es difícil usar el "uso de constructo" con sockets porque no se construyen, utilizan ni eliminan en una única llamada a método. Los sockets a menudo viven más tiempo que un solo método y, por lo tanto, tienen que tener Dispose invocado directamente. –

19

Cerrar y desechar son los mismos en este caso. Cuando Ms introdujo el patrón Dispose en .Net 1, la palabra Dispose no era muy reconocible. Por lo tanto, la guía fue para agregar palabras clave específicas del contexto que harán la misma funcionalidad y serán más fácilmente detectables por los usuarios. Me gusta Cerrar para archivos y sockets.

+3

+ 1 lección de historia genial :). – Kevin

+0

Publicación relevante del blog de MSDN: [La diferencia entre Cerrar y Eliminar] (https://blogs.msdn.microsoft.com/kimhamil/2008/03/15/the-often-non-difference-between-close-and- disponer/). – Paul

2

En general, muchos consideran que es una buena práctica cerrar objetos identificables, porque hace que el código sea más claro. Llamar explícitamente a Dispose, sin embargo, se realiza automáticamente si encapsula el uso del IDisposable en una instrucción using, como se describe en this page.

0

Vamos .NET invocan disponer:

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

La pregunta no es sobre lo que se usa, sino más bien si debe llamar a .Dispose() después de llamar a .Close() (independientemente de llamar a Dispose explícitamente o no). –

0

Tiene usted razón. La documentación no está clara ya que en el método de eliminación está escrito que debe llamar a Dispose() para limpiar los recursos no administrados del socket, pero por otro lado Close debe hacer lo mismo. Supongo que Cerrar llamadas Dispose o lo contrario. El mismo comportamiento es respaldado por archivos, por lo que es una suposición educada.

+0

Para algunos tipos de objetos, 'Cerrar' podría retener algunos recursos que permitirían que el objeto se volviera a abrir; para otros tipos, 'Close 'no tendría razón para retener ningún recurso. En cualquier caso, dado que no debería haber daño al llamar a 'IDisposable.Dispose' después de 'Close', al hacerlo asegurará la compatibilidad con ambos tipos de objetos. – supercat

Cuestiones relacionadas