{"id":260,"date":"2026-03-04T01:46:21","date_gmt":"2026-03-04T01:46:21","guid":{"rendered":"https:\/\/hackcuba.net\/?p=260"},"modified":"2026-03-04T01:46:21","modified_gmt":"2026-03-04T01:46:21","slug":"c-3-0","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=260","title":{"rendered":"C# 3.0"},"content":{"rendered":"\n<p>Muchos expertos han subvalorado las mejoras de C# 3.0; aseguran que sus nuevas ofertas no son m\u00e1s que az\u00facar sint\u00e1ctica. Lo cierto es que esta nueva versi\u00f3n es mucho m\u00e1s vers\u00e1til y est\u00e1 orientada a aliviarle la vida al desarrollador, a\u00fan m\u00e1s que las anteriores. Con este art\u00edculo pretendo acercarlos a las principales mejoras del mismo. Algunas, por razones de espacio, ser\u00e1n m\u00e1s resumidas.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Las principales innovaciones son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Variables de tipo impl\u00edcito<\/li>\n\n\n\n<li>Tipos An\u00f3nimos<\/li>\n\n\n\n<li>Inicializadores de objetos y colecciones<\/li>\n\n\n\n<li>M\u00e9todos de Extensi\u00f3n<\/li>\n\n\n\n<li>Expresiones <em>Lambda<\/em><\/li>\n\n\n\n<li>Expresiones de Pregunta (<em>Query Expressions<\/em>)<\/li>\n\n\n\n<li><em>Arrays<\/em> de Tipo Impl\u00edcito<\/li>\n\n\n\n<li>Arboles de Expresi\u00f3n<\/li>\n\n\n\n<li>Variables de tipo implicito.<\/li>\n<\/ul>\n\n\n\n<p>Se introduce la nueva palabra clave <code>var<\/code>, la cual permite declarar nuevas variables, cuyo tipo se infiere impl\u00edcitamente de la expresi\u00f3n usada para inicializar la variable. Ejemplo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n var i = 1;\nvar intArr = new&#x5B;] {1,2,3,4}; \n<\/pre><\/div>\n\n\n<p>Para asegurar que se cumpla en todo momento con la seguridad de tipos, C# require que se inicialice la variable despu\u00e9s de declararla (<code>var i;<\/code> explotar\u00eda sin remedio). A esta forma de reconocer impl\u00edcitamente el tipo de un objeto se le ver\u00e1 su extraordinario aporte m\u00e1s adelante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tipos Anonimos (TA):<\/h2>\n\n\n\n<p>C# 3.0 brinda la flexibilidad de crear instancias de una clase sin haberlas definido.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar Anon = new {hair=&quot;black&quot;, skin=&quot;green&quot;, teethCount=64};\n<\/pre><\/div>\n\n\n<p>Vendr\u00eda siendo igual a:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nclass Anonymous1\n{\n  private string _hair = &quot;black&quot;;\n  private string _skin = &quot;green&quot;;\n  private int _teeth = 64;\n  public string hair {get {return _hair;} set {_hair = value;}}\n  public string skin {get {return _skin;} set {_skin = value;}}\n  public int teeth {get {return _teeth; } set {_teeth = value; }}\n}\n<\/pre><\/div>\n\n\n<p>Un inicializador de objeto an\u00f3nimo declara un tipo an\u00f3nimo y devuelve una instancia de ese tipo. Un tipo an\u00f3nimo hereda directamente de <code>object<\/code>. Como pudimos observar, un TA es una secuencia de propiedades de lectura\/escritura inferidas del inicializador o inicializadores de objeto.<\/p>\n\n\n\n<p>El nombre de un tipo an\u00f3nimo es generado autom\u00e1ticamente por el compilador y no puede ser referenciado en el texto del programa. Dentro del mismo programa, dos inicializadores de objetos an\u00f3nimos que especifiquen una secuencia de propiedades de los mismos nombres y tipos en el mismo orden producir\u00e1n instancias del mismo tipo an\u00f3nimo. En concreto:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar p1 = new {Name = &quot;Lawnmower&quot;, Price = 495.00};\nvar p2 = new {Name = &quot;Shovel&quot;, Price = 26.95};\np1 = p2; \/\/esto es totalmente v\u00e1lido\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\">Inicializadores de objetos y colecciones:<\/h2>\n\n\n\n<p>Antes:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class CoOrdinate{\n  public int x ;\n  public int y;\n}\n<\/pre><\/div>\n\n\n<p>Ahora podemos declarar e inicializar un objeto <code>CoOrdinate<\/code> de la siguiente manera:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n var myCoOrd = new CoOrdinate{x = 0, y = 0}; \/\/aqu\u00ed se infiere hasta el tipo int de x y y.\n<\/pre><\/div>\n\n\n<p>Para trabajar con colecciones:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nList&lt;string&gt; animals = new List&lt;string&gt;();\nanimals.Add(&quot;monkey&quot;);\nanimals.Add(&quot;donkey&quot;);\nanimals.Add(&quot;cow&quot;);\nanimals.Add(&quot;dog&quot;);\nanimals.Add(&quot;cat&quot;);\n<\/pre><\/div>\n\n\n<p>Ahora para simplificar podemos hacer:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nList&lt;string&gt; animals = new List&lt;string&gt; {&quot;monkey&quot;, &quot;donkey&quot;, &quot;cow&quot;, &quot;dog&quot;, &quot;cat&quot;};\n<\/pre><\/div>\n\n\n<p>Esto es como un objeto <code>List<\/code> que creamos tan f\u00e1cilmente como hacemos con un <em>array<\/em> de <em>strings<\/em>. Una colecci\u00f3n se entiende en este contexto como un tipo que implementa <code>System.Collections.Generic.ICollection&lt;T&gt;<\/code> para exactamente una <code>T<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Los Metodos de Extensi\u00f3n:<\/h2>\n\n\n\n<p>Los m\u00e9todos extendidos posibilitan extender varios tipos con m\u00e9todos est\u00e1ticos adicionales (importante lo de est\u00e1tico). Sin embargo, ellos son muy limitados y deben ser usados como un \u00faltimo recurso, s\u00f3lo cuando los m\u00e9todos de instancia son insuficientes. Los m\u00e9todos extendidos pueden ser declarados s\u00f3lo en clases est\u00e1ticas y son definidos por la palabra clave <code>this<\/code> como un modificador en el primer par\u00e1metro del m\u00e9todo. A continuaci\u00f3n un ejemplo de un m\u00e9todo extendido v\u00e1lido:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n public static int ToInt32(this string s)\n{\n  return Convert.ToInt32(s);\n}\n<\/pre><\/div>\n\n\n<p>Si la clase est\u00e1tica que contiene el m\u00e9todo antes expuesto es importada usando la palabra clave <code>using<\/code>. El m\u00e9todo <code>ToInt32<\/code> aparecer\u00e1 en los tipos existentes (a pesar de esto es de poca preferencia con respecto a m\u00e9todos de instancia existentes) y se podr\u00e1 compilar y ejecutar c\u00f3digo como el siguiente:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nstring s = &quot;1&quot;;\nint i = s.ToInt32();\n<\/pre><\/div>\n\n\n<p>Esto nos permite tomar ventaja de la naturaleza extensible de varios tipos internos definidos y agregar nuevos m\u00e9todos al mismo. Todos los objetos tienen el m\u00e9todo <code>ToString()<\/code>. No te gustar\u00eda que la clase <code>String<\/code> tuviera los m\u00e9todos: <code>ToInt()<\/code>, <code>ToDouble()<\/code> o <code>TodoLoQueSea()<\/code>. Esta opci\u00f3n creo que eriza a todos los que nos gusta manosear c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Expresiones <em>lambda<\/em>:<\/h2>\n\n\n\n<p>C# 2.0 introdujo los m\u00e9todos an\u00f3nimos que permit\u00edan escribir bloques de c\u00f3digo \u201cen l\u00ednea\u201d donde valores delegados eran esparcidos, pero la sintaxis era verbosa e imperativa. Las expresiones <em>lambda<\/em> son una forma m\u00e1s concisa de escribir m\u00e9todos an\u00f3nimos. En C# 1.x los delegados se trataban de la siguiente manera:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nclass Program{\n  delegate void DemoDelegate();\n  static void Main(string&#x5B;] args) {\n    DemoDelegate myDelegate = new DemoDelegate(SayHi);\n    myDelegate();\n  }\n  void SayHi(){\n    Console.Writeline(&quot;Hiya!!&quot;) ;\n  }\n}\n<\/pre><\/div>\n\n\n<p>En C# 2.0, usando m\u00e9todos an\u00f3nimos, podemos escribir lo mismo un poco m\u00e1s c\u00f3modo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nclass Program{\n  delegate void DemoDelegate();\n  static void Main(string&#x5B;] args){\n    DemoDelegate myDelegate = delegate(){Console.Writeline(&quot;Hiya!!&quot;);};\n    myDelegate() ;\n  }\n}\n<\/pre><\/div>\n\n\n<p><br>Podemos escribir expresiones <em>lambda<\/em> como una lista de par\u00e1metros, seguidos del <em>token<\/em> <code>=><\/code>, y un bloque de expresiones o sentencias:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nclass Program{\n  delegate void DemoDelegate();\n  static void Main(string&#x5B;] args){\n    DemoDelegate myDelegate = () =&gt; Console.WriteLine(&quot;Hiya!!&quot;) ; \/\/que creen.\n    myDelegate();\n  }\n}\n<\/pre><\/div>\n\n\n<p>Las expresiones <em>lambda<\/em> ofrecen las siguientes funcionalidades adicionales:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Permiten que los tipos de los par\u00e1metros sean inferidos. Los m\u00e9todos an\u00f3nimos requer\u00edan expl\u00edcitamente los tipos de sus par\u00e1metros.<\/li>\n\n\n\n<li>Pueden soportar tambi\u00e9n expresiones <em>Query<\/em>.<\/li>\n\n\n\n<li>Pueden ser tratadas como datos usando \u00e1rboles de expresi\u00f3n.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><em>Arrays<\/em> de Tipos Impl\u00edcitos:<\/h2>\n\n\n\n<p>La sintaxis para crear <em>arrays<\/em> se ha extendido para soportar la creaci\u00f3n de <em>arrays<\/em> de tipo impl\u00edcito.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar a = new&#x5B;] {1, 10, 100, 1000}; \/\/ int&#x5B;]\nvar b = new&#x5B;] {1, 1.5, 2, 2.5}; \/\/ double&#x5B;]\nvar c = new&#x5B;] {&quot;hello&quot;, null, &quot;world&quot;;}; \/\/ string&#x5B;]\nvar d = new&#x5B;] {1, &quot;one&quot;, 2, &quot;two&quot;}; \/\/ Error, no se puede convertir int a string o al rev\u00e9s.\n<\/pre><\/div>\n\n\n<p>Se atreven a combinar esta t\u00e9cnica con objetos an\u00f3nimos:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar contacts = new&#x5B;] {\n  new {Name = &quot;Krlo&quot;, PhoneNumbers = new&#x5B;] {&quot;55-55-55&quot;, &quot;07708-73&quot;}},\n  new {Name = &quot;Alien&quot;, PhoneNumbers = new&#x5B;] {&quot;650-555-0199&quot;}}\n};\n<\/pre><\/div>\n\n\n<p>El que no se acostumbre a escribir comentarios va a pasar trabajo. Esto, un poco m\u00e1s complicado, a la semana no hay Dios que lo entienda.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Expresiones de Pregunta (<em>Query Expressions<\/em>):<\/h2>\n\n\n\n<p>Esta innovaci\u00f3n ofrece una sintaxis integrada en el lenguaje para consultas, similar a los lenguajes de consulta relacionales y jer\u00e1rquicos, como SQL y XQuery. No domino bien el SQL, pero les aseguro que este punto es muy ventajoso, sobre todos para quienes trabajan con bases de datos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Arboles de Expresi\u00f3n (AE):<\/h2>\n\n\n\n<p>Los <em>Expression Trees<\/em> permiten a las expresiones <em>lambda<\/em> ser representadas como estructuras de datos en lugar de c\u00f3digo ejecutable. En otras palabras, logran que expresiones sean tratadas como datos en tiempo de ejecuci\u00f3n. El objetivo es poder modificar y examinar expresiones <em>lambda<\/em> en tiempo de ejecuci\u00f3n. Los AE son objetos de tipo <code>System.Expressions.Expression&lt;T&gt;<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones:<\/h2>\n\n\n\n<p>Trat\u00e9 de ser breve en todo momento. Espero que les haya servido de <em>background<\/em> para cuando tengan al esperado personaje. La versi\u00f3n final 3.0 de .NET Framework est\u00e1 cada vez m\u00e1s cerca (<a href=\"http:\/\/www.microsoft.com\/downloads\/details.aspx?FamilyID=19e21845-f5e3-4387-95ff-66788825c1af&amp;DisplayLang=en\" target=\"_blank\" rel=\"noreferrer noopener\">ya est\u00e1 disponible la Pre-Release<\/a>). La mejora fundamental del Framework 3.0 ser\u00e1n las bibliotecas para programar formularios Windows Vista con estilo 3D, es decir mayor uso de las transparencias, efectos gr\u00e1ficos m\u00e1s vistosos y un mayor uso de la tarjeta gr\u00e1fica. Recordar que todas estas opciones se pueden desactivar y correr un Windows Vista con aspecto \u00abnormal\u00bb pero con mejoras significativas sobre la seguridad y estabilidad.<\/p>\n\n\n\n<p>\u00bfY ORCAS? El entorno de desarrollo ser\u00e1 Visual Studio 2005, parece que Visual Studio 2007 o ORCAS tardar\u00e1 todav\u00eda un poco en salir e incluir\u00e1 de serie las bibliotecas para trabajar con LINX, el \u00abnuevo\u00bb lenguaje XML para datos (\u00bfqui\u00e9n se embulla a hablar de LINX o Ajax en <strong>BlackHat<\/strong>?). Esta versi\u00f3n traer\u00e1 soporte total para las bibliotecas WinFX (esto es como la API de Vista).<\/p>\n\n\n\n<p>Escrito por Krlo [<a href=\"mailto:blackhat4all@gmail.com?subject=para Krlo\">blackhat4all@gmail.com<\/a>]<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Muchos expertos han subvalorado las mejoras de C# 3.0; aseguran que sus nuevas ofertas no son m\u00e1s que<\/p>\n","protected":false},"author":2,"featured_media":261,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18,36],"tags":[102,58,38],"class_list":["post-260","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-programacion","category-proyecto-blackhat","tag-c-2","tag-programacion","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=260"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions"}],"predecessor-version":[{"id":262,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/260\/revisions\/262"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/261"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=260"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=260"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}