una sirve recursos que para objetos objeto metodos instanciar destruir clases clase administrados c# .net web-services dispose idisposable

sirve - ¿Debería un objeto.Net/C#llamar a Dispose() sobre sí mismo?



para que sirve dispose(); (8)

A continuación se muestra un código de muestra escrito por un colega. Esto me parece obviamente incorrecto, pero quería verificarlo. ¿Debería un objeto llamar a su propio método Dispose () desde uno de sus propios métodos? Me parece que solo el propietario / creador del objeto debe llamar a Dispose () cuando termina con el objeto y no el objeto en sí.

Es un método web .asmx que llama a Dispose () sobre sí mismo cuando termina. (El hecho de que es un método web es probablemente accesorio a la pregunta en general.) En nuestra base de código a veces instanciamos clases de servicio web dentro de métodos de otros servicios web y luego llamamos a métodos sobre ellos. Si mi código hace eso para llamar a este método, el objeto es tostado cuando el método retorna y ya no puedo usar el objeto.

[WebMethod] public string MyWebMethod() { try { return doSomething(); } catch(Exception exception) { return string.Empty; } finally { Dispose(true); } }

ACTUALIZACIÓN: se encontraron algunos enlaces que están relacionados:

¿Debo disponer de una referencia de servicio web en ASP.NET?

¿Desechar una clase de proxy de servicio web?


¡No! Es un comportamiento inesperado y rompe las pautas de mejores prácticas. Nunca hagas nada que no haya sido resumido. Su objeto solo debe hacer lo que sea necesario para mantener su estado mientras protege la integridad del objeto para la persona que llama. La persona que llama decidirá cuándo se hace (o el GC si nada más).


Hay muy pocas razones válidas para realizar una acción de "autodestrucción". Threading es el que uso más que no.

Tengo varias aplicaciones que "disparan y olvidan" hilos. El uso de esta metodología permite que el objeto se autodisponga.

Esto ayuda a mantener el medio ambiente limpio sin un proceso de gestión de hilos.


Mientras que un objeto .Net normalmente no llamaría a Dispose sobre sí mismo, hay ocasiones en que el código que se ejecuta dentro de un objeto puede ser lo último que se espera que lo esté utilizando. Como ejemplo simple, si un método Dispose puede manejar la limpieza de un objeto parcialmente construido, puede ser útil tener un constructor codificado de la siguiente manera:

Sub New() Dim OK As Boolean = False Try ... do Stuff OK = True Finally If Not OK Then Me.Dispose End Try End Sub

Si el constructor lanzará una excepción sin regresar, entonces el objeto parcialmente construido, que está programado para su abandono, será lo único que tendrá la información y el ímpetu para realizar la limpieza necesaria. Si no se ocupa de garantizar un desecho oportuno, nada más lo hará.

Con respecto a su pieza de código en particular, el patrón es algo inusual, pero se parece un poco a la forma en que un socket se puede pasar de un hilo a otro. Hay una llamada que devuelve una matriz de bytes e invalida un Socket; ese conjunto de bytes se puede usar en otro hilo para crear una nueva instancia de Socket que tome el control del flujo de comunicaciones establecido por el otro Socket. Tenga en cuenta que los datos con respecto al socket abierto es efectivamente un recurso no administrado, pero no puede ser incluido en un objeto con un finalizador porque a menudo se va a entregar a algo que el recolector de basura no puede ver.


No hay restricciones técnicas sobre lo que se permite hacer con un método de eliminación. Lo único especial es que se llama a Dispose en ciertos constructos ( foreach , using ). Debido a eso, Dispose se puede usar razonablemente para marcar un objeto como no utilizable, especialmente si la llamada es idempotente.

Sin embargo, no lo usaría para este propósito, debido a la semántica aceptada de Dispose. Si quisiera marcar un objeto como no utilizable desde dentro de la misma clase, entonces crearía un método MarkUnuseable () que podría invocarse mediante Dispose o en cualquier otro lugar.

Al restringir las llamadas a Dispose a los patrones comúnmente aceptados, usted compra la capacidad de realizar cambios en los métodos Dispose en todas sus clases con la confianza de que no romperá inesperadamente ningún código que se desvíe del patrón común.


Por supuesto que no es un buen prartice. La persona que llama debe decidir cuándo terminó de usar el objeto IDisposable, no un objeto en sí mismo.


Solo elimínalo, pero ten cuidado de desecharlo en todos los objetos que lo llamen.



si alguna vez veo eso en uno de mis proyectos, preguntaría por qué y estoy 99.9999% seguro de que lo eliminaría de todos modos

para mí este es un tipo de olor a bandera roja / código