<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Lluís Franco on Geeks.ms : C#, Debate</title><link>http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/Debate/default.aspx</link><description>Etiquetas: C#, Debate</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>[Debate] Nombre de Namespaces en métodos extensores ¿Y tu que opinas?</title><link>http://geeks.ms/blogs/lfranco/archive/2011/01/13/debate-nombre-de-namespaces-en-m-233-todos-extensores-191-y-tu-que-opinas.aspx</link><pubDate>Thu, 13 Jan 2011 12:19:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:187244</guid><dc:creator>Lluis Franco</dc:creator><slash:comments>19</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/lfranco/rsscomments.aspx?PostID=187244</wfw:commentRss><comments>http://geeks.ms/blogs/lfranco/archive/2011/01/13/debate-nombre-de-namespaces-en-m-233-todos-extensores-191-y-tu-que-opinas.aspx#comments</comments><description>&lt;p&gt;Ayer, a ra&amp;iacute;z de &lt;a href="http://geeks.ms/blogs/jtorrecilla/archive/2011/01/11/tip-rapido-m-233-todo-extensor.aspx"&gt;un post&lt;/a&gt; del colega Javier Torrecilla sobre m&amp;eacute;todos extensores, unos cuantos de nosotros entre los que estaban el propio Javier y Jorge Serrano nos enzarzamos en una discusi&amp;oacute;n en twitter acerca del mejor modo de declarar nuestros m&amp;eacute;todos extensores.&lt;/p&gt;
&lt;p&gt;Pongamos un ejemplo: Supongamos que queremos crear un m&amp;eacute;todo extensor para comprobar si un valor est&amp;aacute; entre dos valores (el cl&amp;aacute;sico between de toda la vida).&lt;/p&gt;
&lt;p&gt;Agrego una clase llamada ExtensionMethods a mi proyecto, o a otro proyecto mi soluci&amp;oacute;n y agrego este c&amp;oacute;digo:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; CustomExtensions&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ExtensionMethods&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Between&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; T @&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;, T min, T max) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : IComparable&amp;lt;T&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; @&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;.CompareTo(min) &amp;gt;= 0 &amp;amp;&amp;amp; @&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;.CompareTo(max) &amp;lt;= 0;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Suponiendo que estamos en un proyecto de tipo WinForms, si queremos utilizar este m&amp;eacute;todo extensor sobre un valor de tipo int basta con ir a cualquier formulario y llamar al m&amp;eacute;todo between sobre un valor de este tipo. Por ejemplo:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/EM1_5F00_1AD32F93.png"&gt;&lt;img height="195" width="451" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/EM1_5F00_thumb_5F00_1196F452.png" alt="EM1" border="0" title="EM1" style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oops! Que pasa? Por que no aparece el m&amp;eacute;todo extensor? Bueno, como ya os habr&amp;eacute;is dado cuenta el m&amp;eacute;todo extensor est&amp;aacute; declarado dentro de un namespce llamado &amp;lsquo;CustomExtensions&amp;rsquo;, que es distinto al namespace del formulario en el que lo estoy probando, con lo que no podemos usarlo directamente si previamente no hacemos un using:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; CustomExtensions;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Vale, ahora si que aparece:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/EM2_5F00_1DB86E79.png"&gt;&lt;img height="216" width="526" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/lfranco/EM2_5F00_thumb_5F00_2E506967.png" alt="EM2" border="0" title="EM2" style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Bien. Esto en si no es nada del otro mundo, pero la cuesti&amp;oacute;n es que si deseamos evitar declarar el using (ten&amp;eacute;is que pensar que este m&amp;eacute;todo extensor lo pod&amp;eacute;is reutilizar en 1000 proyectos distintos), no tenemos otra opci&amp;oacute;n que:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Declarar el m&amp;eacute;todo extensor en un namespace que se llame igual que el namespace en el que se va a usar.&lt;/li&gt;
&lt;li&gt;Declarar el m&amp;eacute;todo extensor en un namespace que se llame igual que el namespace del tipo que estamos extendiendo.&lt;/li&gt;
&lt;li&gt;Pasar de todo y llamarlo al namespace como queramos, y que a la hora de usarlo debamos usar un using para agregarlo.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Particularmente, al extender tipos b&amp;aacute;sicos (string, int)&amp;nbsp;soy partidario del segundo punto, de modo que si vamos a extender elementos de tipo IComparable, en lugar de usar el namespace &amp;lsquo;CustomExtensions&amp;rsquo; prefiero usar el nombre del namespace que contiene la definici&amp;oacute;n de este tipo, o sea &amp;lsquo;System&amp;rsquo;:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; &lt;span style="background-color:#ffff00;"&gt;System&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ExtensionMethods&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; Between&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; T @&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;, T min, T max) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : IComparable&amp;lt;T&amp;gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; @&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;.CompareTo(min) &amp;gt;= 0 &amp;amp;&amp;amp; @&lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;.CompareTo(max) &amp;lt;= 0;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pero ese es &lt;strong&gt;mi punto de vista&lt;/strong&gt;, tu que opinas? Twitteros manifestaos! :-)&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=187244" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/lfranco/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Frikadas/default.aspx">Frikadas</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/2010/default.aspx">2010</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Codigo/default.aspx">Codigo</category><category domain="http://geeks.ms/blogs/lfranco/archive/tags/Debate/default.aspx">Debate</category></item></channel></rss>