<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9173433244360026664</id><updated>2011-04-21T16:14:57.991-07:00</updated><title type='text'>Andrés.Giménez</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andrechi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9173433244360026664/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andrechi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>andrechi</name><uri>http://www.blogger.com/profile/01968575174982887073</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9173433244360026664.post-4688627565584633591</id><published>2007-12-26T09:38:00.000-08:00</published><updated>2007-12-26T11:07:28.801-08:00</updated><title type='text'>Patrón Dispose</title><content type='html'>&lt;div align="justify"&gt;Cuando programaba en lenguajes de bajo nivel, como C y C++, todo el mundo tenía mucho cuidado en liberar los recursos que utilizaba. Pero desde la llegada de los recolectores de basura, es algo que se ha ido olvidando. E incluso ignorando por las nuevas generaciones de programadores.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;El recolector de basura en .Net hay que reconocer que quita mucho trabajo. Pero hay que echarle una mano para que su funcionamiento mejore. Me he encontrado servicios en producción que consumen 1Gb de RAM. Si 1Gb para un solo servicio. Y ya sé que .Net consume mucha memoria, pero no es necesaria tanta. Con una correcta utilización del interface &lt;strong&gt;IDisposable&lt;/strong&gt; se puede reducir el consumo de memoria de aplicaciones administradas en un 10%, de lo que consumen sin tenerlo en cuenta.&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;Una primera forma de ayudar al recolector de basura, que en la mayoría de los casos se respeta es llamar al método &lt;strong&gt;Dispose&lt;/strong&gt; de un objeto, cuando este se deja de usar. O utilizar la palabra clave using, que en definitiva hace lo mismo.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (FileStream fs = File.Create(path))&lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="justify"&gt;Que es la forma abreviada de&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;FileStream fs;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    FileStream fs = File.Create(path);&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;finally&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;    fs.Dispose();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Lo que no es tan abitual, pero si tan importante es implementar corectamente el interface IDisposable. Todas las clases que hacen referencia a clases que implementan IDisposable deberian implementarla. &lt;/div&gt;&lt;div align="justify"&gt;&lt;br /&gt;Para implementar &lt;strong&gt;IDisposable&lt;/strong&gt; solo es necesario implementar la propiedad &lt;strong&gt;Dispose(),&lt;/strong&gt; pero en la practica, es recomendable hacerlo de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Base : IDisposable&lt;br /&gt;{&lt;br /&gt;    DisposableObject obj1;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;    {&lt;br /&gt;        Dispose(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;        GC.SuppressFinalize(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (disposing)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(obj1 != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            obj1.Dispose();&lt;br /&gt;        }&lt;br /&gt;        / Liberar objetos no mánejados.&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ~Base()&lt;br /&gt;    {&lt;br /&gt;        ispose(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;div align="justify"&gt;Al implementarlo de esta forma conseguimos lo siguiente: &lt;ol&gt;&lt;li&gt;&lt;div align="justify"&gt;La clase es heredable de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Base : IDisposable&lt;br /&gt;{&lt;br /&gt;    DisposableObject obj1;&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;    {&lt;br /&gt;        Dispose(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;        GC.SuppressFinalize(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;virtual&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (disposing)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(obj1 != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            obj1.Dispose();&lt;br /&gt;        }&lt;br /&gt;        / Liberar objetos no mánejados.&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ~Base()&lt;br /&gt;    {&lt;br /&gt;        ispose(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Al llamar a GC.SuppressFinalize se le indica al recolector de basura que no llame al finalizador del objeto, con lo que la liberación de recurso por parte del recolector de basura es mucho más rápida.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div align="justify"&gt;Permite definir un destructor de la clase. Aunque no es recomendable usarlo salvo en clases que utilicen recursos no administrados. No es recomendable definir destructores que no hagan nada, ya que dificultan la labor al recolector de basura.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="justify"&gt;En caso de que se quiera declarar una clase que no sea heredable, no nos permitirá definir el método Dispose como virtual. Con lo que se hará de la siguiente forma:&lt;/div&gt;&lt;br /&gt;&lt;pre&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; sealer Base : IDisposable&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    DisposableObject obj1;       &lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose()&lt;br /&gt;    {&lt;br /&gt;        Dispose(&lt;span style="color:#0000ff;"&gt;true&lt;/span&gt;);&lt;br /&gt;        GC.SuppressFinalize(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose(&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; disposing)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (disposing)&lt;br /&gt;        { &lt;br /&gt;            (obj1 != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            obj1.Dispose();&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color:#008000;"&gt;// Liberar objetos no mánejados.&lt;/span&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ~Base()&lt;br /&gt;    {&lt;br /&gt;        Dispose(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9173433244360026664-4688627565584633591?l=andrechi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andrechi.blogspot.com/feeds/4688627565584633591/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9173433244360026664&amp;postID=4688627565584633591' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9173433244360026664/posts/default/4688627565584633591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9173433244360026664/posts/default/4688627565584633591'/><link rel='alternate' type='text/html' href='http://andrechi.blogspot.com/2007/12/patrn-dispose.html' title='Patrón Dispose'/><author><name>andrechi</name><uri>http://www.blogger.com/profile/01968575174982887073</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
