tag:blogger.com,1999:blog-4364815135056214516.post2745834743021504819..comments2024-02-07T01:18:20.816-08:00Comments on Programación desordenada: Snippet para IDisposableSergio Leónhttp://www.blogger.com/profile/07959547392771610349noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-4364815135056214516.post-74062365924081771552015-03-30T06:30:21.743-07:002015-03-30T06:30:21.743-07:00Estoy pensando... :)
Entonces en su versión más b...Estoy pensando... :)<br /><br />Entonces en su versión más básica (sólo tratando con objetos manejados) quedaría muy sencillo, algo así:<br /><br /> bool _disposed;<br /><br /> public void Dispose()<br /> {<br /> if (_disposed)<br /> return;<br /><br /> // free other managed objects that implement<br /> // IDisposable only<br /><br /> _disposed = true;<br /> }Sergio Leónhttps://www.blogger.com/profile/07959547392771610349noreply@blogger.comtag:blogger.com,1999:blog-4364815135056214516.post-9623401543406207072015-03-30T06:26:08.089-07:002015-03-30T06:26:08.089-07:00Buenas!
Si NO defines Finalize no necesites GC.Su...Buenas!<br /><br />Si NO defines Finalize no necesites GC.SupressFinalize, ya que no hace nada. Puedes usarlo sí, pero no lo necesitas.<br /><br />"if obj does not have a finalizer, the call to the SuppressFinalize method has no effect." - https://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx<br /><br />Saludos!eiximenishttps://www.blogger.com/profile/02568454383791432108noreply@blogger.comtag:blogger.com,1999:blog-4364815135056214516.post-27050136706638135762015-03-30T06:12:04.498-07:002015-03-30T06:12:04.498-07:00El "GC.SuppressFinalize(this)" sí está b...El "GC.SuppressFinalize(this)" sí está bien utilizado.<br /><br />public void Dispose()<br />{<br /> Dispose(true);<br /> <br /> // Sólo se suprime el "Finalize()" si el "Dispose(...)"<br /> // se ha ejecutado correctamente<br /> GC.SuppressFinalize(this);<br />}<br /><br />Capítulo 9.4.1 de "Framework Design Guidelines".Baldernoreply@blogger.comtag:blogger.com,1999:blog-4364815135056214516.post-8567662718095258102015-03-30T06:11:25.734-07:002015-03-30T06:11:25.734-07:00Gracias por los comentarios!
Esto es lo bueno de p...Gracias por los comentarios!<br />Esto es lo bueno de publicar, que he aprendido más con lo que me corregís que con lo que digo! :)<br />Queda claro que si no se tiene código para tratar con recursos no-manejados (la parte del comentario "release any unmanaged objects, set the object references to null"), no hara falta el finalizador (de hecho es mala práctica con consecuencias de rendimiento como bien ha explicado @Balder), luego no haría falta tampoco el GC.SupressFinalize, luego quedaría bastante más compacto el código y más correcto.<br />Gracias!<br />Sergio Leónhttps://www.blogger.com/profile/07959547392771610349noreply@blogger.comtag:blogger.com,1999:blog-4364815135056214516.post-58988502198328481602015-03-30T05:53:08.404-07:002015-03-30T05:53:08.404-07:00Es una mala práctica incluir el "finalizer&qu...Es una mala práctica incluir el "finalizer" siempre que se implementa "IDisposable". El "finalizer" está pensado para eliminar recursos no manejados cuando el GC procede al borrado definitivo del objeto. Incluir "finalizer" penaliza mucho el rendimiento y aumenta la complejidad, se recomienda no utilizarlo.<br /><br />Problemas de los objetos finalizables:<br /><br />1. Como se tienen que guardar en una lista de objetos finalizables la creación de instancias es más lenta.<br /><br />2. Cuando se detecta que un objeto finalizable es "unreachable" se mueve a una cola "to-be-finalized".<br /><br />3. Sólo hay un hilo para ejecutar los "finalizers", por lo tanto si hay muchos "finalizers" puede haber problemas de escalabilidad.<br /><br />Si es necesario liberar recursos no manejados mejor utilizar un tipo que encapsule estas operaciones (wrapper). Este tipo sí tiene que implementar el patrón finalizable.<br /><br />.NET ofrece un "wrapper" para este tipo de funcionalidad: SafeHandle. Un "wrapper" que herede de esta clase suele ser la mejor opción.<br /><br />Todo esto viene explicado en el capítulo 9.4.2 del libro "Framework Design Guidelines".Baldernoreply@blogger.comtag:blogger.com,1999:blog-4364815135056214516.post-38759077715172056772015-03-30T05:43:15.819-07:002015-03-30T05:43:15.819-07:00Buenas!
Un par de comentarios ;-)
1. GC.SupressFi...Buenas!<br />Un par de comentarios ;-)<br /><br />1. GC.SupressFinalize solo debería llamarse en el Dispose si se ha redefinido el método Finalize.<br />2. El método Finalize solo debería redefinirse para llamar a Dispose(false) si el método Dispose(bool) contiene código para tratar con código NO manejado.<br /><br />Saludos! ;-)eiximenishttps://www.blogger.com/profile/02568454383791432108noreply@blogger.com