﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
  <channel>
    <title>Pensando en asincrono</title>
    <description>.NET</description>
    <link>http://vtortola.net/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.6.1.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://vtortola.net/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>My name</dc:creator>
    <dc:title>Pensando en asincrono</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <item>
      <title>Integrar un video de YouTube en Silverlight 2</title>
      <description>&lt;a href="http://www.vtortola.net/image.axd?picture=WindowsLiveWriter/IntegrarunvideodeYouTubeenSilverlight2_1276B/silveryoutubemini_1.jpg"&gt;&lt;img style="border-width: 0px; margin: 0px 15px 0px 0px" src="http://www.vtortola.net/image.axd?picture=WindowsLiveWriter/IntegrarunvideodeYouTubeenSilverlight2_1276B/silveryoutubemini_thumb_1.jpg" border="0" alt="silveryoutubemini" align="left" /&gt;&lt;/a&gt;  
&lt;p&gt;
&amp;nbsp;Me pareci&amp;oacute; tan curioso que me decid&amp;iacute; a probarlo :D Es sabido, que no se puede insertar un componente Flash en Silverlight 2 ... pero&amp;nbsp;como comenta&amp;nbsp;&lt;a href="http://weblogs.manas.com.ar/ary"&gt;Ary Boretc&lt;/a&gt; se puede &lt;a href="http://weblogs.manas.com.ar/ary/2008/09/11/embedding-youtube-videos-in-silverlight/"&gt;meter en un DIV flotante&lt;/a&gt; y colocarlo en&amp;nbsp;la pantalla. Funciona bastante bien, aunque no funciona a pantalla completa (ya que en pantalla completa solo se puede ver la aplicaci&amp;oacute;n Silverlight) y tampoco funciona en Internet Explorer, intentar&amp;eacute; averiguar porque :P
&lt;/p&gt;
 
&lt;p&gt;
Me faltaba entonces poder moverlo a voluntad como si fuese un elemento m&amp;aacute;s en mi &lt;a href="http://silverlight.vtortola.net/"&gt;emulador de escritorio&lt;/a&gt;. El control que Ary propone, tiene unas propiedades para controlar la posici&amp;oacute;n y el tama&amp;ntilde;o asi que simplemente es cuesti&amp;oacute;n de &amp;quot;atar&amp;quot; el div al contenido de la ventana, todo gracias a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.transformtovisual(VS.95).aspx"&gt;TransformToVisual()&lt;/a&gt;.
&lt;/p&gt;
 
&lt;p&gt;

&lt;/p&gt;
 
&lt;p&gt;
Cada ventana es un &lt;em&gt;UserControl&lt;/em&gt; que acepta otro parametro como &lt;em&gt;Content&lt;/em&gt; , asi que debia hacer que en todo momento el div ocupase la superficie de ese &lt;em&gt;Content&lt;/em&gt;, tanto al moverlo como al redimensionarlo; aunque son elementos de mundos distintos, bailan sobre la misma superficie, un &lt;em&gt;Canvas&lt;/em&gt; (en este caso una clase derivada), asi que simplemente se trata de obtener las coordenadas absolutas del Content con respecto al &lt;em&gt;Canvas&lt;/em&gt; y aplicarselas al DIV flotante para controlar su posici&amp;oacute;n, adem&amp;aacute;s de controlar tambi&amp;eacute;n el tama&amp;ntilde;o, que ha de ser el mismo.
&lt;/p&gt;
 
&lt;p&gt;
Lo primero creo un &lt;em&gt;UserControl&lt;/em&gt; que ser&amp;aacute; el contenedor virtual del video (digo virtual, porque realmente no contiene nada :P), y este control inicializa el control &lt;em&gt;YouTubePlayer&lt;/em&gt; de Ary.
&lt;/p&gt;
 
&lt;p&gt;
Siguiente, necesito acceder a la ventana para que me informe cada vez que el layout cambia. Creo que no hay una forma dada para escalar en el arbol visual buscando un Parent espec&amp;iacute;fico; yo cree un m&amp;eacute;todo extensor para este fin:
&lt;/p&gt;
 
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T GetParent&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; FrameworkElement element)
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;where&lt;/span&gt; T : FrameworkElement
&lt;/pre&gt;
&lt;pre class="alt"&gt;
{
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;while&lt;/span&gt; (element.Parent != &lt;span class="kwrd"&gt;null&lt;/span&gt;)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (element.Parent &lt;span class="kwrd"&gt;is&lt;/span&gt; T)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            &lt;span class="kwrd"&gt;return&lt;/span&gt; (T)element.Parent;
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            element = element.Parent &lt;span class="kwrd"&gt;as&lt;/span&gt; FrameworkElement;
&lt;/pre&gt;
&lt;pre&gt;
    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Una vez tengo el objeto ventana que contiene my &lt;em&gt;UserContorl&lt;/em&gt; me subscribo a su evento &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.layoutupdated(VS.95).aspx"&gt;LayoutUpdated&lt;/a&gt;. Este m&amp;eacute;todo extensor me vale tambi&amp;eacute;n para encontrar el &lt;em&gt;Canvas&lt;/em&gt; donde &amp;quot;bailan&amp;quot; los elementos, para poder obtener la posici&amp;oacute;n relativa a este. Cada vez que la ventana se redimensione, se dispara el evento &lt;em&gt;LayoutUpdated&lt;/em&gt;, pero no cuando se mueve, ya que lo que estoy modificando son las propiedades asociadas &lt;em&gt;Canvas.Top&lt;/em&gt; y &lt;em&gt;Canvas.Left&lt;/em&gt;, asi que me asegurar&amp;eacute; de que cada vez que se mueve la ventana se llame a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.invalidatemeasure.aspx"&gt;InvalidateMeasure()&lt;/a&gt; para se dispare el citado evento.
&lt;/p&gt;
&lt;p&gt;
Ahora, en el manejador del evento &lt;em&gt;LayoutUpdated&lt;/em&gt; que nos subscribimos, hay que actualizar la posici&amp;oacute;n del DIV flotante cada vez que la ventana cambia. Dentro de mi &lt;em&gt;UserControl&lt;/em&gt;, hay un control de tipo &lt;em&gt;ContentControl&lt;/em&gt;&amp;nbsp; que he llamado&amp;nbsp;&lt;em&gt;YTContainer&lt;/em&gt;, que es donde el video deber&amp;aacute; aparecer.&amp;nbsp;&amp;nbsp;Gracias a &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.uielement.transformtovisual(VS.95).aspx"&gt;TransformToVisual()&lt;/a&gt; podemos obtener cual es la posici&amp;oacute;n relativa a un control de cualquiera de sus descendientes, aunque no sean descendientes directos, como es el caso (hay toda una jerarquia de &lt;em&gt;Grids&lt;/em&gt;, ventanas y &lt;em&gt;UserControl&lt;/em&gt; desde &lt;em&gt;YTContainer&lt;/em&gt; al &lt;em&gt;Canvas&lt;/em&gt;):
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
Point position = YTContainer.TransformToVisual(surface)
&lt;/pre&gt;
&lt;pre&gt;
                           .Transform(&lt;span class="kwrd"&gt;new&lt;/span&gt; Point(0, 0));
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
player.Top = position.Y;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
player.Left = position.X;
&lt;/pre&gt;
&lt;pre&gt;
player.Width = YTContainer.ActualWidth;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
player.Height = YTContainer.ActualHeight;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;De esa forma se que punto en el &lt;em&gt;Canvas&lt;/em&gt; se corresponde con el punto relativo &amp;quot;0,0&amp;quot; de &lt;em&gt;YTContainer,&lt;/em&gt; ya simplemente tengo que actualizar las propiedades del &lt;em&gt;YoutubePlayer&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Y nada m&amp;aacute;s, se puede ver el resultado en &lt;a href="http://silverlight.vtortola.net/"&gt;mi emulador de escritorio&lt;/a&gt;. Investigar&amp;eacute; porque no funciona en Internet Explorer.
&lt;/p&gt;
&lt;p&gt;
Creo que tambi&amp;eacute;n se puede hacer usando propiedades de dependencia y data binding...&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
</description>
      <link>http://vtortola.net/post/Integrar-un-video-de-YouTube-en-Silverlight-2.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Integrar-un-video-de-YouTube-en-Silverlight-2.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=b293c5db-95dd-4ee2-94f4-54332c1a5501</guid>
      <pubDate>Sun, 17 May 2009 23:00:00 +1000</pubDate>
      <category>C# 3.0</category>
      <category>.NET 3.5</category>
      <category>Silverlight 2</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=b293c5db-95dd-4ee2-94f4-54332c1a5501</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=b293c5db-95dd-4ee2-94f4-54332c1a5501</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Integrar-un-video-de-YouTube-en-Silverlight-2.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=b293c5db-95dd-4ee2-94f4-54332c1a5501</wfw:commentRss>
    </item>
    <item>
      <title>Gestor de ventanas (Window Manager) en Silverlight 2</title>
      <description>&lt;p&gt;
&lt;a href="http://www.vtortola.net/image.axd?picture=WindowsLiveWriter/GestordeventanasWindowManagerenSilverlig_E9E1/silverwindow.jpg"&gt;&lt;img style="border-width: 0px; margin: 0px 15px 0px 0px" src="http://www.vtortola.net/image.axd?picture=WindowsLiveWriter/GestordeventanasWindowManagerenSilverlig_E9E1/silverwindow_thumb.jpg" border="0" alt="silverwindow" align="left" /&gt;&lt;/a&gt; He creado un peque&amp;ntilde;o &lt;a href="http://es.wikipedia.org/wiki/Gestor_de_ventanas"&gt;gestor de ventanas&lt;/a&gt; como&amp;nbsp;libreria&amp;nbsp;para &lt;a href="http://silverlight.net/"&gt;Silverlight 2&lt;/a&gt;, que permite a&amp;ntilde;adir cualquier FrameworkElement embebido en una ventana, que se puede mover (desde la barra de t&amp;iacute;tulo), redimensionar (desde la esquina inferior derecha), &amp;nbsp;colapsar (bot&amp;oacute;n _) y&amp;nbsp;cerrar (bot&amp;oacute;n X). Adem&amp;aacute;s las ventanas pueden ser ordenadas en cascada &amp;oacute; en mosaico.
&lt;/p&gt;
 
&lt;p&gt;
La clase se llama &lt;em&gt;SilverWindowManager&lt;/em&gt;, hereda de &lt;em&gt;Canvas&lt;/em&gt;, y lo que hace es crear unos elementos llamados &lt;em&gt;SilverWindow&lt;/em&gt;, que son &lt;em&gt;UserControl&lt;/em&gt;, y conectar 5 eventos entre ventana y escritorio, dos del &amp;quot;escritorio&amp;quot; a la ventana para que se puedan realizar las acciones de mover y redimensionar, y 3 de la ventana al escritorio para informar cuando se activa &amp;oacute; cierra una ventana. &lt;em&gt;SilverWindow&lt;/em&gt; usa el &lt;em&gt;FrameworkElement&lt;/em&gt; que se le pasa en el constructor para rellenar su espacio de trabajo. Cualquier &lt;em&gt;FrameworkElement&lt;/em&gt; es bueno, desde por ejemplo &lt;em&gt;MediaElement&lt;/em&gt; para poner un video, como un &lt;em&gt;UserControl&lt;/em&gt;, de hecho lo que este ejemplo abre cada vez es una nueva instancia de un &lt;em&gt;UserControl&lt;/em&gt; llamado &lt;em&gt;DummyUserCtrl&lt;/em&gt; que tiene un color de fondo aleatorio.
&lt;/p&gt;
 
&lt;p&gt;

&lt;/p&gt;
 
&lt;ul&gt;
	 
	&lt;li&gt;Se puede ver en este enlace : &lt;a href="http://www.vtortola.net/silverlight2/windowmanager.html"&gt;&lt;strong&gt;Gestor de Ventanas Silverlight&lt;/strong&gt;&lt;/a&gt;. (Los videos son de silverlight.net y tardan un poco en cargar :P)  &lt;/li&gt;
	&lt;li&gt;He subido la soluci&amp;oacute;n tambi&amp;eacute;n: &lt;a href="http://www.vtortola.net/silverlight2/WMS2_Test.zip"&gt;C&amp;oacute;digo fuente&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
 
&lt;p&gt;
Hay una cosa con la que no estoy muy contento, y es el comportamiento de redimensionar, primero porque parece que redimensiona a menos velocidad de la que se mueve el puntero y no consigo ver por que, y segundo porque al moverse el puntero fuera de la zona de redimensionamiento mientras esta redimensionando, hace que el evento MouseLeftButtonUp pase en cualquier sitio... y al ser incomprensiblemente de tipo &lt;em&gt;Direct&lt;/em&gt; en lugar de &lt;em&gt;Bubbling &lt;/em&gt;(su hom&amp;oacute;logo en WPF tambi&amp;eacute;n es &lt;em&gt;Direct&lt;/em&gt;, pero adem&amp;aacute;s tiene un &lt;em&gt;MouseUp&lt;/em&gt; de tipo &lt;em&gt;Bubbling&lt;/em&gt;), si se libera sobre un TextBox &amp;oacute; Bot&amp;oacute;n parece que se queda la acci&amp;oacute;n enganchada hasta el siguiente &amp;quot;mouse up&amp;quot; porque el evento se corta en ese control. Asi que si alguien le echa un vistazo al c&amp;oacute;digo y ve el porque de estos problemas... le estaria muy agradecido si me lo dice :D
&lt;/p&gt;
 
&lt;p&gt;
El dise&amp;ntilde;o no es muy all&amp;aacute;, pero es que ni&amp;nbsp;todav&amp;iacute;a me he puesto a utilizar &lt;em&gt;Expression Blend 2&lt;/em&gt;... ni todav&amp;iacute;a estoy muy puesto en cuestiones de dise&amp;ntilde;o gr&amp;aacute;fico :D
&lt;/p&gt;
 
&lt;p&gt;
Esta es mi 4&amp;ordm; experimento con Silvelight 2, y la verdad es que esta bastante limitado con respecto a su hermano mayor WPF(con el que batallo dia a dia), se echan mucho&amp;nbsp;de menos los estilos impl&amp;iacute;citos, los&amp;nbsp;triggers, las&amp;nbsp;opciones de databinding como ElementName y RelativeSource,&amp;nbsp;la distribuci&amp;oacute;n de eventos, el bot&amp;oacute;n derecho y central del rat&amp;oacute;n... los triggers... y supongo que habr&amp;aacute; m&amp;aacute;s cosas que no est&amp;aacute;n... ya los ir&amp;eacute; echando en falta :P Pero bien lo vale por lo peque&amp;ntilde;o que es el runtime,&amp;nbsp;me gusta bastante :D
&lt;/p&gt;
</description>
      <link>http://vtortola.net/post/Gestor-de-ventanas-(Window-Manager)-en-Silverlight-2.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Gestor-de-ventanas-(Window-Manager)-en-Silverlight-2.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=bdae8dcc-261f-4b01-97dc-900dfb7f7994</guid>
      <pubDate>Sun, 08 Feb 2009 20:31:00 +1000</pubDate>
      <category>C# 3.0</category>
      <category>.NET 3.5</category>
      <category>Silverlight 2</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=bdae8dcc-261f-4b01-97dc-900dfb7f7994</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=bdae8dcc-261f-4b01-97dc-900dfb7f7994</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Gestor-de-ventanas-(Window-Manager)-en-Silverlight-2.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=bdae8dcc-261f-4b01-97dc-900dfb7f7994</wfw:commentRss>
    </item>
    <item>
      <title>Ordenaciones personalizadas con LINQ</title>
      <description>&lt;p&gt;
Esta ma&amp;ntilde;ana necesitaba &lt;a href="http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx"&gt;ordenar&lt;/a&gt; los elementos de una tabla en funci&amp;oacute;n de uno de los campos, pero el problema era que la comparaci&amp;oacute;n no era alfab&amp;eacute;tica ni similar,&amp;nbsp;era en funci&amp;oacute;n de unos criterios propios; uno de los par&amp;aacute;metros que aceptan los m&amp;eacute;todos extensores &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.orderby.aspx"&gt;OrderBy&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.orderbydescending.aspx"&gt;OrderByDescending&lt;/a&gt;&lt;/em&gt;, &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.thenby.aspx"&gt;ThenBy&lt;/a&gt;&lt;/em&gt; and &lt;em&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.enumerable.thenbydescending.aspx"&gt;ThenByDescending&lt;/a&gt;&lt;/em&gt; es un &lt;a href="http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx"&gt;IComparer&amp;lt;&amp;gt;&lt;/a&gt;, prob&amp;eacute; y funcion&amp;oacute;, asignaba un peso a cada valor y luego comparaba en el m&amp;eacute;todo &lt;a href="http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx"&gt;Compare&lt;/a&gt;&amp;nbsp;los pesos de los dos par&amp;aacute;metros de entrada,&amp;nbsp;pero a&amp;uacute;n asi no me gustaba como quedaba, no me gustaba lo de tener que escribir una clase solo para este prop&amp;oacute;sito... buscaba algo m&amp;aacute;s... compacto...&amp;nbsp;asi que con ayuda de mi compa&amp;ntilde;ero&amp;nbsp;use un delegado an&amp;oacute;nimo primero que directamente&amp;nbsp;devolvia el peso&amp;nbsp;en &lt;strong&gt;TKey&lt;/strong&gt; inferido como &lt;em&gt;Int32&lt;/em&gt;, que es en lo que LINQ basaria la ordenaci&amp;oacute;n&amp;nbsp;y luego lo substitu&amp;iacute; por una expresi&amp;oacute;n lambda; es realmente interesante como LINQ te facilita la vida :D
&lt;/p&gt;
 
&lt;p&gt;

&lt;/p&gt;
 
&lt;p&gt;
Este peque&amp;ntilde;o ejemplo ordena un &lt;em&gt;DataTable&lt;/em&gt; en funci&amp;oacute;n de su columna &lt;em&gt;&amp;quot;Country&amp;quot;&lt;/em&gt; asignando a cada valor un peso en &lt;em&gt;Int32&lt;/em&gt;&amp;nbsp;y siendo este peso el que devuelve&amp;nbsp;la expresi&amp;oacute;n infiriendo&amp;nbsp;&lt;strong&gt;TKey&lt;/strong&gt; como &lt;em&gt;Int32&lt;/em&gt;, que ser&amp;aacute; en lo que LINQ base ordenaci&amp;oacute;n de los elementos. Anotar que el elemento que queramos que tenga m&amp;aacute;s relevancia debe ser el de menos peso y el que menos el que m&amp;aacute;s peso:
&lt;/p&gt;
 
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
DataTable EmployeesByCountry = 
&lt;/pre&gt;
&lt;pre&gt;
            EmployeesTable.AsEnumerable()
&lt;/pre&gt;
&lt;pre class="alt"&gt;
            &lt;span class="rem"&gt;//.OrderBy(delegate(DataRow Employee)&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
            .OrderBy(Employee =&amp;gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                {
&lt;/pre&gt;
&lt;pre&gt;
                    &lt;span class="kwrd"&gt;switch&lt;/span&gt;(Employee.Field&amp;lt;String&amp;gt;(&lt;span class="str"&gt;&amp;quot;Country&amp;quot;&lt;/span&gt;))
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                    {
&lt;/pre&gt;
&lt;pre&gt;
                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Denmark&amp;quot;&lt;/span&gt;:&lt;span class="kwrd"&gt;return&lt;/span&gt; 3;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;France&amp;quot;&lt;/span&gt;:&lt;span class="kwrd"&gt;return&lt;/span&gt; 2;
&lt;/pre&gt;
&lt;pre&gt;
                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Ireland&amp;quot;&lt;/span&gt;:&lt;span class="kwrd"&gt;return&lt;/span&gt; 4;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;Spain&amp;quot;&lt;/span&gt;:&lt;span class="kwrd"&gt;return&lt;/span&gt; 1;
&lt;/pre&gt;
&lt;pre&gt;
                        &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;UK&amp;quot;&lt;/span&gt;:&lt;span class="kwrd"&gt;return&lt;/span&gt; 5;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                        &lt;span class="kwrd"&gt;default&lt;/span&gt;: &lt;span class="kwrd"&gt;return&lt;/span&gt; Int32.MaxValue;
&lt;/pre&gt;
&lt;pre&gt;
                    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                }).CopyToDataTable();
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A&amp;uacute;n as&amp;iacute; estoy&amp;nbsp;seguro que habr&amp;aacute; formas&amp;nbsp;mejores y m&amp;aacute;s sencillas de hacerlo.&amp;nbsp;Evidentemente es mejor si tenemos un algorritmo que calcule el peso&amp;nbsp;en lugar de tener que fijarlos &amp;quot;a cap&amp;oacute;n&amp;quot; ... pero hay situaciones... que no hay m&amp;aacute;s remedio :D
&lt;/p&gt;
</description>
      <link>http://vtortola.net/post/Ordenaciones-personalizadas-con-LINQ.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Ordenaciones-personalizadas-con-LINQ.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=2fff58ed-34d1-4f22-beaa-429cfe45bb7f</guid>
      <pubDate>Sat, 13 Sep 2008 04:39:00 +1000</pubDate>
      <category>C# 3.0</category>
      <category>.NET 3.5</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=2fff58ed-34d1-4f22-beaa-429cfe45bb7f</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=2fff58ed-34d1-4f22-beaa-429cfe45bb7f</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Ordenaciones-personalizadas-con-LINQ.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=2fff58ed-34d1-4f22-beaa-429cfe45bb7f</wfw:commentRss>
    </item>
    <item>
      <title>Update-Select en un DataTable con LINQ</title>
      <description>&lt;p&gt;
&amp;Uacute;ltimamente ya no escribo nada, estoy totalmente inmerso en el mundo LINQ con el&amp;nbsp;&lt;a href="http://shop.campusmvp.com/Product-C-3.0-y-LINQ_1.aspx"&gt;C# 3.0 y LINQ&lt;/a&gt;&amp;nbsp;de Octavio Hernandez&amp;nbsp;y el &lt;a href="http://www.amazon.com/LINQ-Action-Fabrice-Marguerie/dp/1933988169/ref=pd_bbs_sr_2"&gt;LINQ en Action&lt;/a&gt; ...&amp;nbsp;y poco hay que&amp;nbsp;contar que no este en libros&amp;nbsp;&amp;oacute; en los&amp;nbsp;cientos de blogs que llevan escribiendo sobre LINQ desde hace mucho tiempo. A&amp;uacute;n asi por lo menos ir&amp;eacute; escribiendo alguna cosilla sobre LINQ aunque solo sea para que no se me olvide como hacer ciertas cosas y tener que&amp;nbsp;volverlas a buscar&amp;nbsp;:P
&lt;/p&gt;
&lt;p&gt;
Este es un ejemplo simple&amp;nbsp;de como lanzar una consulta Update-Select con LINQ sobre un DataTable, apoyandonos en el ya famoso &lt;a href="http://codebetter.com/blogs/glenn.block/archive/2008/08/19/foreach-a-simple-but-very-useful-extension-method.aspx"&gt;m&amp;eacute;todo extensor ForEach&lt;/a&gt; ... (que seg&amp;uacute;n me ha comentado un compa&amp;ntilde;ero es posible que aparezca en la BCL pr&amp;oacute;ximamente), lo que hace es en cada DataRow que cumple con las condiciones dadas introduce en la columna &amp;quot;Initial&amp;quot; la primera letra del nombre... (nada complicado vamos xD)
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
EmployeesTable.AsEnumerable()
&lt;/pre&gt;
&lt;pre&gt;
   .Where(EmployeeRow =&amp;gt; !EmployeeRow.IsNull(&lt;span class="str"&gt;&amp;quot;Country&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp; 
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                  EmployeeRow.Field&amp;lt;String&amp;gt;(&lt;span class="str"&gt;&amp;quot;Country&amp;quot;&lt;/span&gt;) == &lt;span class="str"&gt;&amp;quot;UK&amp;quot;&lt;/span&gt; &amp;amp;&amp;amp;
&lt;/pre&gt;
&lt;pre&gt;
                  !EmployeeRow.IsNull(&lt;span class="str"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;) &amp;amp;&amp;amp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                  EmployeeRow.Field&amp;lt;String&amp;gt;(&lt;span class="str"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;) != String.Empty)
&lt;/pre&gt;
&lt;pre&gt;
   .ForEach(EmployeeRow =&amp;gt; EmployeeRow.SetField&amp;lt;String&amp;gt;(&lt;span class="str"&gt;&amp;quot;Initial&amp;quot;&lt;/span&gt;, 
&lt;/pre&gt;
&lt;pre class="alt"&gt;
                                EmployeeRow.Field&amp;lt;String&amp;gt;(&lt;span class="str"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;).Substring(0, 1)));
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Tambi&amp;eacute;n empezar&amp;eacute; ahora a escribir sobre WPF... que me toca ponerme las pilas :D
&lt;/p&gt;
</description>
      <link>http://vtortola.net/post/Update-Select-en-un-DataTable-con-LINQ.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Update-Select-en-un-DataTable-con-LINQ.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=9552ee17-fe25-4f8c-a6de-9e3ed024b14e</guid>
      <pubDate>Fri, 12 Sep 2008 03:30:00 +1000</pubDate>
      <category>C# 3.0</category>
      <category>.NET 3.5</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=9552ee17-fe25-4f8c-a6de-9e3ed024b14e</pingback:target>
      <slash:comments>3</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=9552ee17-fe25-4f8c-a6de-9e3ed024b14e</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Update-Select-en-un-DataTable-con-LINQ.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=9552ee17-fe25-4f8c-a6de-9e3ed024b14e</wfw:commentRss>
    </item>
    <item>
      <title>Consumir un Webservice SSL</title>
      <description>&lt;p&gt;
Mas sencillo de lo que imaginaba, se trata simplemente de definir el siguiente delegado &lt;a href="http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.servercertificatevalidationcallback.aspx"&gt;System.Net.ServicePointManager.ServerCertificateValidationCallback&lt;/a&gt;con la funcion que se encarga de validar el certificado.
&lt;/p&gt;
  
&lt;p&gt;
Por ejemplo:
&lt;/p&gt;
  
&lt;div class="csharpcode"&gt;
   
&lt;pre class="alt"&gt;
System.Net.ServicePointManager.ServerCertificateValidationCallback =
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Net.Security.RemoteCertificateValidationCallback(ValidateSSL);
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Y escribimos el metodo:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;static&lt;/span&gt; Boolean ValidateSSL(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, X509Certificate certificate, 
&lt;/pre&gt;
&lt;pre&gt;
                           X509Chain chain, SslPolicyErrors sslPolicyErrors)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
{
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;// Validar el certificado...&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;// Un ejemplo tosco para aceptar cualquiera sin errores.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;return&lt;/span&gt; sslPolicyErrors == SslPolicyErrors.None;
&lt;/pre&gt;
&lt;pre&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
</description>
      <link>http://vtortola.net/post/Consumir-un-Webservice-SSL.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Consumir-un-Webservice-SSL.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=02bbfc39-f67a-4833-8970-bb38d60b5cc6</guid>
      <pubDate>Wed, 10 Sep 2008 03:29:00 +1000</pubDate>
      <category>.NET 2.0</category>
      <category>C# 2.0</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=02bbfc39-f67a-4833-8970-bb38d60b5cc6</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=02bbfc39-f67a-4833-8970-bb38d60b5cc6</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Consumir-un-Webservice-SSL.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=02bbfc39-f67a-4833-8970-bb38d60b5cc6</wfw:commentRss>
    </item>
    <item>
      <title>Cargar un tipo dinamicamente</title>
      <description>&lt;img style="border: 0px none ; margin: 0px 20px 0px 0px" src="http://vtortola.net/image.axd?picture=WindowsLiveWriter/Cargaruntipodinamicamente_1468D/dynamictypeproject_3.png" border="0" alt="dynamictypeproject" align="left" /&gt; 
&lt;p&gt;
&amp;nbsp; Una aplicaci&amp;oacute;n modular suele ser una aplicaci&amp;oacute;n donde sus funcionalidades son opcionales, de forma que podemos quitar &amp;oacute; a&amp;ntilde;adirlas seg&amp;uacute;n nos convenga.&amp;nbsp;La aplicaci&amp;oacute;n solo sabe que va a tratar con instancias que cumplen un&amp;nbsp;determinado contrato, ya sea&amp;nbsp;cumpliendo con&amp;nbsp;una &lt;a href="http://vtortola.net/post/El-uso-de-interfaces.aspx"&gt;interfaz&lt;/a&gt; &amp;oacute;&amp;nbsp;determinado tipo base (usando clases abstractas). Estos contratos suelen estar en ensamblados que conocen las dos partes, de forma que la aplicaci&amp;oacute;n espera una instancia de clase que cumple el contrato definido en el ensamblado com&amp;uacute;n, y el ensamblado &amp;quot;opcional&amp;quot; provee una instancia de clase que cumple dicho contrato, dicho contrato &amp;oacute; acuerdo mutuo indica a la aplicaci&amp;oacute;n como usar dicha instancia. En el ejemplo de soluci&amp;oacute;n de Visual Studio que se ve&amp;nbsp;a la izquierda, &lt;strong&gt;LoadTypeTest&lt;/strong&gt; ser&amp;iacute;a la aplicaci&amp;oacute;n, &lt;strong&gt;Common&lt;/strong&gt; el ensamblado compartido donde se definen los contratos y los tipos comunes,&amp;nbsp;y &lt;strong&gt;LibraryTest&lt;/strong&gt; donde se encuentra definida la clase, &lt;strong&gt;LoadTypeTest&lt;/strong&gt; y &lt;strong&gt;LibraryTest&lt;/strong&gt; tienen referenciado a &lt;strong&gt;Common&lt;/strong&gt;, pero se desconocen entre ellos.
&lt;/p&gt;
 
&lt;p&gt;

&lt;/p&gt;
 
&lt;p&gt;
En en ensamblado com&amp;uacute;n he definido una &lt;a href="http://vtortola.net/post/El-uso-de-interfaces.aspx"&gt;interfaz&lt;/a&gt; y un delegado, que definen la forma en que la instancia &amp;quot;desconocida&amp;quot; se va a relacionar con la aplicaci&amp;oacute;n:
&lt;/p&gt;
 
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; DataArrival_(String Data);
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ITestInterface
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    String Name { get; }
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;event&lt;/span&gt; DataArrival_ DataArrival;
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;void&lt;/span&gt; SendData(String Data);
&lt;/pre&gt;
&lt;pre&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Si la clase que que implementamos cumpliendo esta &lt;a href="http://vtortola.net/post/El-uso-de-interfaces.aspx"&gt;interfaz&lt;/a&gt;, tiene un constructor por defecto, tenemos dos formas de cargar el tipo din&amp;aacute;micamente:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/cxz4wk15.aspx"&gt;Reflection&lt;/a&gt;:&lt;/strong&gt;
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
Assembly myAssembly = Assembly.LoadFrom(&lt;span class="str"&gt;&amp;quot;LibraryTest.dll&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
ITestInterface test2 = myAssembly.CreateInstance(&lt;span class="str"&gt;&amp;quot;LibraryTest.LibraryTest&amp;quot;&lt;/span&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; ITestInterface;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
test2.DataArrival += &lt;span class="kwrd"&gt;new&lt;/span&gt; DataArrival_(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;(String Data)
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Received: &amp;quot;&lt;/span&gt; + Data);
&lt;/pre&gt;
&lt;pre&gt;
});
&lt;/pre&gt;
&lt;pre class="alt"&gt;
test2.SendData(&lt;span class="str"&gt;&amp;quot;Hello &amp;quot;&lt;/span&gt; + test2.Name + &lt;span class="str"&gt;&amp;quot;!!&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.reflection.assembly.aspx"&gt;Assembly&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.reflection.assembly.loadfrom.aspx"&gt;Assembly.LoadFrom()&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.reflection.assembly.createinstance.aspx"&gt;Assembly.CreateInstance()&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/72x4h507.aspx"&gt;Remoting&lt;/a&gt;:&lt;/strong&gt;
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
ObjectHandle obj = Activator.CreateInstance(&lt;span class="str"&gt;&amp;quot;LibraryTest&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;LibraryTest.LibraryTest&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
ITestInterface test = obj.Unwrap() &lt;span class="kwrd"&gt;as&lt;/span&gt; ITestInterface;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
test.DataArrival += &lt;span class="kwrd"&gt;new&lt;/span&gt; DataArrival_(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;(String Data)
&lt;/pre&gt;
&lt;pre&gt;
    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Received: &amp;quot;&lt;/span&gt; + Data);
&lt;/pre&gt;
&lt;pre&gt;
    });
&lt;/pre&gt;
&lt;pre class="alt"&gt;
test.SendData(&lt;span class="str"&gt;&amp;quot;Hello &amp;quot;&lt;/span&gt;+ test.Name +&lt;span class="str"&gt;&amp;quot;!!&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.runtime.remoting.objecthandle(VS.90).aspx"&gt;ObjectHandle&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.runtime.remoting.objecthandle.unwrap(VS.80).aspx"&gt;Activator.CreateInstance&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://msdn.microsoft.com/es-es/library/system.runtime.remoting.objecthandle.unwrap(VS.80).aspx"&gt;ObjectHandle.Unwrap&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
En este contexto, nos valen ambos planteamientos por igual, ambos cargan la instancia en el mismo dominio de aplicaci&amp;oacute;n que la aplicaci&amp;oacute;n principal y su rendimiento es bastante similar, a excepci&amp;oacute;n de la primera instancia que realiza Remoting, que parece que le cuesta un poco m&amp;aacute;s:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://vtortola.net/image.axd?picture=WindowsLiveWriter/Cargaruntipodinamicamente_1468D/image.png"&gt;&lt;img style="border: 0px none " src="http://vtortola.net/image.axd?picture=WindowsLiveWriter/Cargaruntipodinamicamente_1468D/image_thumb.png" border="0" alt="image" width="483" height="310" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Pero, cuando la instancia tiene un &lt;a href="http://vtortola.net/post/Constructores%2c-inicializacion-rapida-de-objetos-y-C-30.aspx"&gt;constructor&lt;/a&gt; parametrizado tendr&amp;eacute;mos que usar una mezcla de las&amp;nbsp;dos, ya que para poder invocar un constructor espec&amp;iacute;fico&amp;nbsp;debemos de proveer el tipo a &lt;em&gt;Activator.CreateInstance&lt;/em&gt;, que por supuesto lo podemos extraer con &lt;em&gt;Reflection&lt;/em&gt;; vamos a suponer que la calse &amp;quot;desconocida&amp;quot; espera dos par&amp;aacute;metros, un &lt;em&gt;Int32&lt;/em&gt; y un &lt;em&gt;DataTable&lt;/em&gt; (ojo con el orden de los par&amp;aacute;metros):
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
Assembly myAssembly = Assembly.LoadFrom(&lt;span class="str"&gt;&amp;quot;LibraryTest.dll&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
Type myType = myAssembly.GetType(&lt;span class="str"&gt;&amp;quot;LibraryTest.LibraryTest&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
ITestInterface test = Activator.CreateInstance(myType,myIndex,myTable) &lt;span class="kwrd"&gt;as&lt;/span&gt; ITestInterface;
&lt;/pre&gt;
&lt;pre&gt;
test.DataArrival += &lt;span class="kwrd"&gt;new&lt;/span&gt; DataArrival_(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;(String Data)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Received: &amp;quot;&lt;/span&gt; + Data);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    });
&lt;/pre&gt;
&lt;pre&gt;
test.SendData(&lt;span class="str"&gt;&amp;quot;Hello &amp;quot;&lt;/span&gt; + test.Name + &lt;span class="str"&gt;&amp;quot;!!&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Pero... y si ni siquiera supiesemos que n&amp;uacute;mero de par&amp;aacute;metros tiene el &lt;a href="http://vtortola.net/post/Constructores%2c-inicializacion-rapida-de-objetos-y-C-30.aspx"&gt;constructor&lt;/a&gt;... o que tipo de par&amp;aacute;metros son... pues con &lt;em&gt;Reflection&lt;/em&gt; podemos interrogar al tipo para que nos de informaci&amp;oacute;n sobre los constructores que hay en la clase y sus respectivos par&amp;aacute;metros. Un ejemplo un poco tosco :
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
Assembly myAssembly = Assembly.LoadFrom(&lt;span class="str"&gt;&amp;quot;LibraryTest.dll&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre&gt;
Type myType = myAssembly.GetType(&lt;span class="str"&gt;&amp;quot;LibraryTest.LibraryTest&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="rem"&gt;// Interrogo al tipo para comprobar si existe el constructor&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="rem"&gt;// que necesito.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
Object[] constructorParameters = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (ConstructorInfo constructor &lt;span class="kwrd"&gt;in&lt;/span&gt; myType.GetConstructors())
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    ParameterInfo[] parameters = constructor.GetParameters();
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;if&lt;/span&gt; ((parameters[0].ParameterType == &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(Int32)) &amp;amp;&amp;amp;
&lt;/pre&gt;
&lt;pre&gt;
        parameters[1].ParameterType == &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(DataTable))
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
        constructorParameters = &lt;span class="kwrd"&gt;new&lt;/span&gt; Object[] {myIndex, myTable };
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    }
&lt;/pre&gt;
&lt;pre&gt;
    parameters.ToString();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
}
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
ITestInterface test = Activator.CreateInstance(myType,constructorParameters) &lt;span class="kwrd"&gt;as&lt;/span&gt; ITestInterface;
&lt;/pre&gt;
&lt;pre&gt;
test.DataArrival += &lt;span class="kwrd"&gt;new&lt;/span&gt; DataArrival_(&lt;span class="kwrd"&gt;delegate&lt;/span&gt;(String Data)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Received: &amp;quot;&lt;/span&gt; + Data);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    });
&lt;/pre&gt;
&lt;pre&gt;
test.SendData(&lt;span class="str"&gt;&amp;quot;Hello &amp;quot;&lt;/span&gt; + test.Name + &lt;span class="str"&gt;&amp;quot;!!&amp;quot;&lt;/span&gt;);
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Como dec&amp;iacute;a este es un ejemplo un poco tosco, podemos mejorar la l&amp;oacute;gica para detectar el constructor, ordenar los par&amp;aacute;metros... etc.. etc..
&lt;/p&gt;
&lt;p&gt;
Lo m&amp;aacute;ximo que sabe la aplicaci&amp;oacute;n sobre la clase, es su nombre y en que ensamblado esta, cosas que le podemos pasar&amp;nbsp;como par&amp;aacute;metros&amp;nbsp;&amp;oacute; tenerlo alojado en un archivo de configuraci&amp;oacute;n, de forma que alterando dicho archivo la&amp;nbsp;aplicaci&amp;oacute;n usa una u otras funcionalidades.&amp;nbsp;Y con esto e imaginaci&amp;oacute;n puedes hacer tus arquitecturas tan inteligentes y escalables como tu quieras, de forma que sean capaces de cargar tipos sin conocerlos previamente y usarlos por medio de una interfaz &amp;oacute; clase abstracta. Si a esto le a&amp;ntilde;ades el uso de atributos como metadatos para describir las clases... a&amp;uacute;n puedes conseguir cosas m&amp;aacute;s inteligentes y escalables,&amp;nbsp;a ver si tengo tiempo otro d&amp;iacute;a para escribir sobre este tema, que es bastante apasionante :)
&lt;/p&gt;
</description>
      <link>http://vtortola.net/post/Cargar-un-tipo-dinamicamente.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Cargar-un-tipo-dinamicamente.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=9ee148ce-9038-46c4-9547-9fafe8b7a3ce</guid>
      <pubDate>Thu, 17 Jul 2008 05:26:00 +1000</pubDate>
      <category>.NET 2.0</category>
      <category>C# 2.0</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=9ee148ce-9038-46c4-9547-9fafe8b7a3ce</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=9ee148ce-9038-46c4-9547-9fafe8b7a3ce</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Cargar-un-tipo-dinamicamente.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=9ee148ce-9038-46c4-9547-9fafe8b7a3ce</wfw:commentRss>
    </item>
    <item>
      <title>Conversion de arrays sin cast directo con C#</title>
      <description>&lt;p&gt;
Realizar casting entre clases es siempre sencillo, el inconveniente es cuando se trata de un arrays. Por ejemplo... sabiendo que la&amp;nbsp;clase &lt;em&gt;Manager&lt;/em&gt; deriva de &lt;em&gt;Employee&lt;/em&gt;, si tenemos un array de &lt;em&gt;Manager&lt;/em&gt;, es f&amp;aacute;cil convertirlo en un array de &lt;em&gt;Employee&lt;/em&gt; usando casting directo:
&lt;/p&gt;
 
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
Employee[] employees1 = (Employee[])managers;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Pero si tenemos un array de &lt;em&gt;Employee&lt;/em&gt; no es posible convertirlo en&amp;nbsp; un array de &lt;em&gt;Manager&lt;/em&gt; de la misma forma que tampoco podr&amp;iacute;amos hacer un casting directo&amp;nbsp;entre objetos simples. No se me&amp;nbsp;ocurre raz&amp;oacute;n&amp;nbsp;cuerda para&amp;nbsp;querer hacer tal cosa, pero&amp;nbsp;otro ejemplo m&amp;aacute;s cotidiano puede ser cuando intentamos mostrar el contenido de un array en una l&amp;iacute;nea usando &lt;a href="http://msdn.microsoft.com/es-es/library/system.string.join.aspx"&gt;String.Join&lt;/a&gt;, nos daremos cuenta que&amp;nbsp;tiene que ser &lt;em&gt;String[]&lt;/em&gt;. Existen muchas situaciones donde no hay un casting directo.
&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;
Afortunadamente disponemos del m&amp;eacute;todo gen&amp;eacute;rico&amp;nbsp;&lt;a href="http://msdn.microsoft.com/es-es/library/exc45z53(VS.90).aspx"&gt;Array.ConvertAll&amp;lt;,&amp;gt;&lt;/a&gt;&amp;nbsp;y del delegado gen&amp;eacute;rico &lt;a href="http://msdn.microsoft.com/es-es/library/kt456a2y(VS.90).aspx"&gt;Converter&amp;lt;,&amp;gt;&lt;/a&gt; que nos pueden ayudar a simplificar estas cosas:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="rem"&gt;// Primero definimos como se convierte una clase en la otra&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
Converter&amp;lt;Employee, String&amp;gt; Employee2String = &lt;span class="kwrd"&gt;delegate&lt;/span&gt;(Employee m) { &lt;span class="kwrd"&gt;return&lt;/span&gt; m.Name; };
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="rem"&gt;// Despu&amp;eacute;s convertimos todos los elementos del array usando ese delgado&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
String[] sArray = Array.ConvertAll&amp;lt;Employee,String&amp;gt;(Employees,Employee2String);
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;Oacute; podemos hacerlo&amp;nbsp;en una sola l&amp;iacute;nea aprovechando la inferencia de tipos:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
String[] sArray = Array.ConvertAll&amp;lt;Employee,String&amp;gt;(Employees,&lt;span class="kwrd"&gt;delegate&lt;/span&gt;(Employee m) { &lt;span class="kwrd"&gt;return&lt;/span&gt; m.Name; });
&lt;/pre&gt;
&lt;/div&gt;
</description>
      <link>http://vtortola.net/post/Conversion-de-arrays-sin-cast-directo-con-C.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Conversion-de-arrays-sin-cast-directo-con-C.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=aae9d1c4-8fe6-4aad-9149-5b6075682547</guid>
      <pubDate>Sun, 13 Jul 2008 03:00:00 +1000</pubDate>
      <category>.NET 2.0</category>
      <category>C# 2.0</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=aae9d1c4-8fe6-4aad-9149-5b6075682547</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=aae9d1c4-8fe6-4aad-9149-5b6075682547</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Conversion-de-arrays-sin-cast-directo-con-C.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=aae9d1c4-8fe6-4aad-9149-5b6075682547</wfw:commentRss>
    </item>
    <item>
      <title>Desechable o no desechable</title>
      <description>&lt;p&gt;
La interfaz &lt;a href="http://vtortola.net/post/Objetos-desechables-con-la-interfaz-IDisposable.aspx"&gt;IDisposable&lt;/a&gt; nos provee del m&amp;eacute;todo .Dispose() que utilizamos para liberar los recursos que esta usando ese objeto, pero dicho m&amp;eacute;todo... no deja de ser un simple m&amp;eacute;todo ;) Solo hace falta hacer una peque&amp;ntilde;a prueba para darse cuenta:
&lt;/p&gt;
 
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        Desechable test = &lt;span class="kwrd"&gt;new&lt;/span&gt; Desechable();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;          
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        test.Dispose();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        Console.WriteLine(test.Cadena??&lt;span class="str"&gt;&amp;quot;Muerto&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;// Muestra: Vivo!&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        Console.ReadKey(&lt;span class="kwrd"&gt;true&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Desechable : IDisposable
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Cadena = &lt;span class="str"&gt;&amp;quot;Vivo!&amp;quot;&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose()
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Ok ok... un poco m&amp;aacute;s complejo:
&lt;/p&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        Desechable test = &lt;span class="kwrd"&gt;new&lt;/span&gt; Desechable();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        WeakReference wr = &lt;span class="kwrd"&gt;new&lt;/span&gt; WeakReference(test.Tabla.Columns[0]);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        test.Dispose();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        test = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        Console.WriteLine(((DataColumn)wr.Target).ColumnName); &lt;span class="rem"&gt;// Muestra &amp;quot;Columna&amp;quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        Console.ReadKey(&lt;span class="kwrd"&gt;true&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Desechable : IDisposable
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; DataTable Tabla = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; Desechable()
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        Tabla.Columns.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; DataColumn(&lt;span class="str"&gt;&amp;quot;Columna&amp;quot;&lt;/span&gt;));
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose()
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        Tabla.Dispose();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  29:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
El resultado cambia si en la l&amp;iacute;nea 10 hacemos un &lt;a href="http://msdn.microsoft.com/es-es/library/system.gc.collect.aspx"&gt;GC.Collect()&lt;/a&gt; ;D
&lt;/p&gt;
&lt;p&gt;
Como vemos, el &amp;uacute;nico que puede liberar memoria en el .NET Framework es el &lt;a href="http://msdn.microsoft.com/es-es/library/0xy59wtx(vs.80).aspx"&gt;Garbage Collector&lt;/a&gt;, por lo que el m&amp;eacute;todo .Dispose() no libera memoria in libera nada, solo nos sirve para asegurar que el objeto que estamos desechando ha cerrado correctamente todos sus recursos y podemos olvidarnos de &amp;eacute;l, ya se encargar&amp;aacute; el GC de liberar la memoria cuando lo crea necesario.
&lt;/p&gt;
&lt;p&gt;
Entonces, implementar la interfaz IDisposable no hace nuestros objetos &amp;quot;destruibles&amp;quot; bajo demanda, ni setear todos los campos a null en Dispose no va a hacer que sea recolectado m&amp;aacute;s deprisa, ni no hacerlo va a evitar que sea recolectado, ni debemos des-subscribir los eventos...
&lt;/p&gt;
&lt;p&gt;
Por lo tanto, debemos implementar &lt;a href="http://vtortola.net/post/Objetos-desechables-con-la-interfaz-IDisposable.aspx"&gt;el patr&amp;oacute;n IDisposable&lt;/a&gt; en una clase siempre que:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Nuestra clase deriva de una clase que lo implementa.&lt;/li&gt;
	&lt;li&gt;Nuestra clase esta compuesta de otras clases que lo implementan.&lt;/li&gt;
	&lt;li&gt;Hagamos uso de recursos no administrados.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Para todo lo dem&amp;aacute;s... &lt;strike&gt;mastercard&lt;/strike&gt; confia en el GC :D
&lt;/p&gt;
&lt;p&gt;
Un&amp;nbsp;tema que causa controversia en este aspecto es... &amp;iquest;que pasa con los delegados? &amp;iquest;Como el estar subscrito a delegados afecta a la recolecci&amp;oacute;n de memoria? Bien, el estar subscrito a un delegado de una clase, no afecta en su recolecci&amp;oacute;n:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        MiClase test = &lt;span class="kwrd"&gt;new&lt;/span&gt; MiClase();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        WeakReference wr = &lt;span class="kwrd"&gt;new&lt;/span&gt; WeakReference(test);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        test.MiEvento += &lt;span class="kwrd"&gt;new&lt;/span&gt; EventHandler(test_MiEvento);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        test = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        GC.Collect();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        Console.WriteLine(wr.IsAlive ? &lt;span class="str"&gt;&amp;quot;Vivo&amp;quot;&lt;/span&gt; : &lt;span class="str"&gt;&amp;quot;Muerto&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;// Muestra &amp;quot;Muerto&amp;quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        Console.ReadKey(&lt;span class="kwrd"&gt;true&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; test_MiEvento(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; MiClase
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler MiEvento;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Pero al rev&amp;eacute;s, es decir, que una clase este subscrita a uno de nuestros delegados... si provoca que el objeto no pueda ser recolectado:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; Program
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;event&lt;/span&gt; EventHandler Evento;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        MiClase test = &lt;span class="kwrd"&gt;new&lt;/span&gt; MiClase();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        WeakReference wr = &lt;span class="kwrd"&gt;new&lt;/span&gt; WeakReference(test);
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        Evento += test.Manejador_Evento;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        test = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        GC.Collect();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        Console.WriteLine(wr.IsAlive ? &lt;span class="str"&gt;&amp;quot;Vivo&amp;quot;&lt;/span&gt; : &lt;span class="str"&gt;&amp;quot;Muerto&amp;quot;&lt;/span&gt;); &lt;span class="rem"&gt;// Muestra &amp;quot;Vivo&amp;quot;&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        Console.WriteLine(Evento.GetInvocationList().Length); &lt;span class="rem"&gt;// Muestra 1&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        Console.ReadKey(&lt;span class="kwrd"&gt;true&lt;/span&gt;);
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; MiClase
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  21:  &lt;/span&gt;{
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Manejador_Evento(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    {
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; NotImplementedException();
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    }
&lt;/pre&gt;
&lt;pre&gt;
&lt;span class="lnum"&gt;  26:  &lt;/span&gt;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Y ojo, que los delegados son muy comodos para ejecutar muchos m&amp;eacute;todos de una pasada (por ejemplo podr&amp;iacute;amos tener una serie de objetos subscritos a un delegado y cada vez que invocaramos a este se ejecutaria ese m&amp;eacute;todo en todos los objetos), pero como veis pueden causar un memory leak; aunque en ese caso poco podemos hacer desde el m&amp;eacute;todo Dispose ya que es otra clase la que ha de desuscribirse.
&lt;/p&gt;
&lt;p&gt;
Saludos desde el frio Dublin donde el Verano es una broma de mal gusto.
&lt;/p&gt;
</description>
      <link>http://vtortola.net/post/Desechable-o-no-desechable.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Desechable-o-no-desechable.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=67172ee3-cae5-423d-9635-a2dd4917fdcf</guid>
      <pubDate>Sat, 12 Jul 2008 00:41:00 +1000</pubDate>
      <category>.NET 2.0</category>
      <category>C# 2.0</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=67172ee3-cae5-423d-9635-a2dd4917fdcf</pingback:target>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=67172ee3-cae5-423d-9635-a2dd4917fdcf</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Desechable-o-no-desechable.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=67172ee3-cae5-423d-9635-a2dd4917fdcf</wfw:commentRss>
    </item>
    <item>
      <title>Constructores, inicializacion rapida de objetos y C# 3.0</title>
      <description>&lt;p&gt;
La &lt;a href="http://www.variablenotfound.com/2008/03/inicializacin-rpida-de-objetos-en-c-30.html"&gt;inicializaci&amp;oacute;n r&amp;aacute;pida de objetos&lt;/a&gt; es una nueva e interesante&amp;nbsp;caracter&amp;iacute;stica de C# 3.0, pero me gustaria reflexionar un poco sobre su uso y el de nuestros amigos los constructores.
&lt;/p&gt;
 
&lt;p&gt;
Un &lt;a href="http://msdn.microsoft.com/es-es/library/ace5hbzh.aspx"&gt;constructor&lt;/a&gt; es el m&amp;eacute;todo de una instancia que implementa las acciones necesarias para inicializar la instancia de la clase, y es invocado por el operador &lt;a href="http://msdn.microsoft.com/es-es/library/51y09td4.aspx"&gt;new&lt;/a&gt; cuando instanciamos dicha clase.&amp;nbsp; Por lo tanto, cuando desarrollamos una clase, el &amp;oacute; los constructores deben de tener la capacidad de inicializar los aspectos b&amp;aacute;sicos de funcionamiento del objeto.
&lt;/p&gt;
 
&lt;p&gt;
En C#, cuando no implementamos&amp;nbsp;ning&amp;uacute;n constructor, el compilador asume que tenemos un constructor sin par&amp;aacute;metros, es decir, esto:
&lt;/p&gt;
 
&lt;p&gt;

&lt;/p&gt;
 
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;class&lt;/span&gt; MyClass
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field1 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field2 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
es lo mismo que esto:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;class&lt;/span&gt; MyClass
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field1 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field2 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; MyClass()
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
    }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
En el momento que definamos un constructor con par&amp;aacute;metros, el compilador deja de asumir la existencia del constructor sin ellos, el motivo me parece m&amp;aacute;s que obvio, &lt;strong&gt;si definimos un constructor con par&amp;aacute;metros estamos diciendo que nuestra clase necesita &amp;quot;otras cosas&amp;quot; para poder inicializarse correctamente&lt;/strong&gt;; si queremos tener otro sin par&amp;aacute;metros tendremos que definirlo explicitamente. 
&lt;/p&gt;
&lt;p&gt;
Una ve las ventajas de usar un constructor param&amp;eacute;trizado, es por&amp;nbsp;ejemplo inicializar&amp;nbsp;propiedades p&amp;uacute;blicas con setter privado, y modificarlas desde el constructor en base a los par&amp;aacute;metros (seguro que no lo has hecho nunca xD); pero la principal ventaja es que le dice al programador que se necesita para ser inicializado y poder empezar a trabajar. A veces no necesitamos par&amp;aacute;metros y otras veces&amp;nbsp;es inevitable y debemos definir un constructor sin par&amp;aacute;metros, como por ejemplo para permitir la &lt;a href="http://msdn.microsoft.com/es-es/library/182eeyhh.aspx"&gt;serializaci&amp;oacute;n en Xml&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Definir constructores es bastante llevadero y poco pesado, ya que gracias a la &lt;strong&gt;sobrecarga&lt;/strong&gt;, se escriben r&amp;aacute;pido, sin repetir el c&amp;oacute;digo en cada uno de ellos y queda bastante claro:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;class&lt;/span&gt; MyControl : Control
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field1 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field2 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field3 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="rem"&gt;// base: nos permite pasar par&amp;aacute;metros a la &lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;// clase de la que heredamos&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; MyControl(Control parent, String text, String field1)
&lt;/pre&gt;
&lt;pre&gt;
        : &lt;span class="kwrd"&gt;base&lt;/span&gt;(parent, text)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Field1 = field1;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    }
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="rem"&gt;// this: nos permite invocar a otro constructor&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;// de la misma clase, de forma que lo que escribimos&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="rem"&gt;// en este prosigue la labor del otro, evitandonos escribir&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;// otra vez lo mismo para cada constructor.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; MyControl(Control parent, String text, String field1, String field2)
&lt;/pre&gt;
&lt;pre&gt;
        : &lt;span class="kwrd"&gt;this&lt;/span&gt;(parent, text, field1)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Field2 = field2;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    }
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="rem"&gt;// this: nos permite llamar a cualquier constructor&lt;/span&gt;
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="rem"&gt;// de la misma clase.&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; MyControl(Control parent, String text, String field1, String field2, String field3)
&lt;/pre&gt;
&lt;pre&gt;
        : &lt;span class="kwrd"&gt;this&lt;/span&gt;(parent, text, field1,field2)
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    {
&lt;/pre&gt;
&lt;pre&gt;
        &lt;span class="kwrd"&gt;this&lt;/span&gt;.Field3 = field3;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    }
&lt;/pre&gt;
&lt;pre&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Tambi&amp;eacute;n se pueden&amp;nbsp;definir &lt;a href="http://msdn.microsoft.com/es-es/library/ms173121.aspx"&gt;modificadores de acceso&lt;/a&gt; en los constructores, de forma que haya constructores que solo se puedan usar desde&amp;nbsp;dentro de la misma clase(private),&amp;nbsp;clase derivada(protected), ensamblado(internal) &amp;oacute; por todo el mundo(public). &amp;Uacute;til para controlar desde donde se pueden instanciar nuestros objetos, &amp;oacute; cuantas veces, como en el patr&amp;oacute;n &lt;a href="http://www.yoda.arachsys.com/csharp/singleton.html"&gt;Singleton&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Adem&amp;aacute;s,&amp;nbsp;podemos definir un &lt;a href="http://msdn.microsoft.com/es-es/library/k9x6w0hc(VS.80).aspx"&gt;constructor est&amp;aacute;tico&lt;/a&gt;, sin par&amp;aacute;metros, sin modificadores de acceso,&amp;nbsp;imposible de invocar directamente... pero que nos permite inicializar lo que queramos antes que nig&amp;uacute;n miembro de la clase, est&amp;aacute;tico &amp;oacute; de instancia, sea usado.
&lt;/p&gt;
&lt;p&gt;
Bien, en C# 3.0 la inicializaci&amp;oacute;n r&amp;aacute;pida&amp;nbsp;de objetos, permiten inicializar las propiedades p&amp;uacute;blicas de una clase de una pasada:
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;class&lt;/span&gt; MyControl : Control
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field1 { get;  set; }
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field2 { get;  set; }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field3 { get;  set; }
&lt;/pre&gt;
&lt;pre&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; String Field4 { get; &lt;span class="kwrd"&gt;private&lt;/span&gt; set; }
&lt;/pre&gt;
&lt;pre class="alt"&gt;
}
&lt;/pre&gt;
&lt;pre&gt;
&amp;nbsp;
&lt;/pre&gt;
&lt;pre class="alt"&gt;
&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()
&lt;/pre&gt;
&lt;pre&gt;
{
&lt;/pre&gt;
&lt;pre class="alt"&gt;
    MyControl mc = &lt;span class="kwrd"&gt;new&lt;/span&gt; MyControl() { Field1 = &lt;span class="str"&gt;&amp;quot;f1&amp;quot;&lt;/span&gt;, Field2 = &lt;span class="str"&gt;&amp;quot;f2&amp;quot;&lt;/span&gt;, Field3 = &lt;span class="str"&gt;&amp;quot;f3&amp;quot;&lt;/span&gt; };
&lt;/pre&gt;
&lt;pre&gt;
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
No voy a discutir de lo &amp;uacute;til que es, porque definitivamente lo es, pero por supuesto no es una caracteristica para reemplazar los constructores porque:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;No podemos inicializar campos privados &amp;oacute; propiedades p&amp;uacute;blicas con &lt;em&gt;setter&lt;/em&gt; privado.&lt;/li&gt;
	&lt;li&gt;Puede que necesitamos ejecutar alguna l&amp;oacute;gica &amp;oacute; incluso otros m&amp;eacute;todos&amp;nbsp;en funci&amp;oacute;n del tipo de par&amp;aacute;metros.&lt;/li&gt;
	&lt;li&gt;No denota cuales son las propiedades que necesita tener configuradas para poder considerarse totalmente inicializado, de cara a alguien que consuma nuestra clase a posteriori. Esto me parece lo m&amp;aacute;s importante, ya que el c&amp;oacute;digo debe intentar ser autodescriptivo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Al igual que los m&amp;eacute;todos parciales, m&amp;eacute;todos extensores &amp;oacute; tipos an&amp;oacute;nimos, es una nueva caracteristica para tener en cuenta y para usar cuando sea apropiado, no viene a reemplazar nada, viene a complementar para &amp;quot;esos casos&amp;quot; donde hace falta.
&lt;/p&gt;
&lt;p&gt;
Si tu clase necesita datos &amp;oacute; ser inicializada, implementa un constructor parametrizado. Por la salud mental de nuestros compa&amp;ntilde;eros de trabajo, hagamos un buen uso del lenguaje :D
&lt;/p&gt;
</description>
      <link>http://vtortola.net/post/Constructores-inicializacion-rapida-de-objetos-y-C-30.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Constructores-inicializacion-rapida-de-objetos-y-C-30.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=612de2c5-3349-4d40-a022-08caf3a2b027</guid>
      <pubDate>Fri, 11 Jul 2008 02:49:00 +1000</pubDate>
      <category>C# 3.0</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=612de2c5-3349-4d40-a022-08caf3a2b027</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=612de2c5-3349-4d40-a022-08caf3a2b027</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Constructores-inicializacion-rapida-de-objetos-y-C-30.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=612de2c5-3349-4d40-a022-08caf3a2b027</wfw:commentRss>
    </item>
    <item>
      <title>Asi da gusto usar Windows Vista</title>
      <description>&lt;p&gt;
Pedazo de maquin&amp;oacute;n que estren&amp;eacute; en el trabajo&amp;nbsp;y con el que estoy m&amp;aacute;s que contento, es un placer trabajar as&amp;iacute;.
&lt;/p&gt;
 
&lt;p&gt;
&lt;img style="border: 0px none " src="http://vtortola.net/image.axd?picture=WindowsLiveWriter/AsidagustousarWindowsVista_13632/image_3.png" border="0" alt="image" width="516" height="180" /&gt; 
&lt;/p&gt;
 
&lt;p&gt;
Mi jefe es de esas personas que sabe como hacerte feliz. Despu&amp;eacute;s de algo m&amp;aacute;s de una&amp;nbsp;semana trabajando con &amp;eacute;l, cuando cojo&amp;nbsp;mi port&amp;aacute;til ya no es lo mismo...&amp;nbsp;definitivamente tengo que hacerme con uno de estos para mi casa :D
&lt;/p&gt;
 
&lt;p&gt;
El monitor no es que se quede atr&amp;aacute;s:
&lt;/p&gt;
 
&lt;p&gt;

&lt;/p&gt;
 
&lt;p&gt;
&lt;img style="border: 0px none " src="http://vtortola.net/image.axd?picture=WindowsLiveWriter/AsidagustousarWindowsVista_13632/image_2.png" border="0" alt="image" width="600" height="494" /&gt; 
&lt;/p&gt;
  
&lt;h6&gt;&lt;a href="http://vtortola.net/post/Asi-da-gusto-usar-Windows-Vista.aspx"&gt;Asi da gusto usar Windows Vista| vtortola.NET&lt;/a&gt;&lt;/h6&gt;
</description>
      <link>http://vtortola.net/post/Asi-da-gusto-usar-Windows-Vista.aspx</link>
      <author>vtortola</author>
      <comments>http://vtortola.net/post/Asi-da-gusto-usar-Windows-Vista.aspx#comment</comments>
      <guid>http://vtortola.net/post.aspx?id=aff16519-9a36-4f0c-8995-5ed87f4c8411</guid>
      <pubDate>Thu, 10 Jul 2008 01:06:00 +1000</pubDate>
      <category>Personal</category>
      <category>Windows</category>
      <dc:publisher>vtortola</dc:publisher>
      <pingback:server>http://vtortola.net/pingback.axd</pingback:server>
      <pingback:target>http://vtortola.net/post.aspx?id=aff16519-9a36-4f0c-8995-5ed87f4c8411</pingback:target>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://vtortola.net/trackback.axd?id=aff16519-9a36-4f0c-8995-5ed87f4c8411</trackback:ping>
      <wfw:comment>http://vtortola.net/post/Asi-da-gusto-usar-Windows-Vista.aspx#comment</wfw:comment>
      <wfw:commentRss>http://vtortola.net/syndication.axd?post=aff16519-9a36-4f0c-8995-5ed87f4c8411</wfw:commentRss>
    </item>
  </channel>
</rss>