{"id":491,"date":"2026-03-08T21:40:48","date_gmt":"2026-03-08T21:40:48","guid":{"rendered":"https:\/\/hackcuba.net\/?p=491"},"modified":"2026-03-08T21:40:48","modified_gmt":"2026-03-08T21:40:48","slug":"delegados-en-c","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=491","title":{"rendered":"Delegados en C#"},"content":{"rendered":"\n<p>Los delegados son una herramienta de gran utilidad en .NET. Aunque son usados s\u00f3lo en casos muy espec\u00edficos, conocerlos es una gran habilidad de nuestro lado que nos permitir\u00e1 resolver muchos problemas en el futuro. Para los programadores de C++, el concepto es muy similar al de los punteros a funciones; los programadores de JavaScript tienen una funcionalidad parecida a trav\u00e9s de objetos <code>Function<\/code> (que rara vez se utilizan). La tecnolog\u00eda .NET convirti\u00f3 esta idea en una herramienta tan f\u00e1cil de utilizar que es un pecado darle de largo.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Primero que todo vamos a definir qu\u00e9 son los delegados:<\/p>\n\n\n\n<p>Los delegados son un tipo (una clase que, por tanto, ha de ser instanciada para utilizar) encargados de agrupar funciones con una signatura en com\u00fan. Observe que dice \u00abfunciones\u00bb, pues un delegado puede representar a varias funciones al mismo tiempo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfCu\u00e1l es el objetivo de un delegado?<\/h2>\n\n\n\n<p>El delegado puede ser llamado como una funci\u00f3n con la idea de ejecutar, en el mismo orden en que entraron, todas sus funciones asignadas. \u00c9sta es su principal funcionalidad, aunque tambi\u00e9n veo \u00fatil el que nos permita pasar funciones como par\u00e1metros a otras funciones. Podremos ver un ejemplo de esto m\u00e1s adelante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3mo declarar un delegado::<\/h2>\n\n\n\n<p>La siguiente instrucci\u00f3n declara un delegado:<\/p>\n\n\n\n<p><code>delegate void Compara(int valor, int valor2) ;<\/code><\/p>\n\n\n\n<p>El delegado anterior funciona como una clase de nombre \u00abCompara\u00bb. Esta clase puede contener cualquier funci\u00f3n que acepte dos par\u00e1metros de tipo <code>int<\/code> y no retorne nada (<code>void<\/code>). Cualquier funci\u00f3n con esta caracter\u00edstica podr\u00e1 ser agregada al delegado <code>Compara<\/code>.<\/p>\n\n\n\n<p>Vamos ahora a instanciar delegados de este tipo y asignarle alguna funci\u00f3n. Primero definimos dos funciones para utilizar con el delegado. La primera escribe por consola <code>true<\/code> si el primer valor es menor que el segundo, y la otra funci\u00f3n hace exactamente lo contrario.<\/p>\n\n\n\n<p><code>static void Metodo1(int valor, int valor2){<br>bool comp = valor &lt; valor2 ;<br>Console.WriteLine(comp.ToString()) ;<br>}<br>static void Metodo2(int valor, int valor2){<br>bool comp = valor &gt; valor2;<br>Console.WriteLine(comp.ToString());<br>}<\/code><\/p>\n\n\n\n<p>Ahora instanciemos un objeto de tipo <code>Compara<\/code> y asign\u00e9mosle estas funciones:<\/p>\n\n\n\n<p><code>Compara c = new Compara(Metodo1) ;<br>c += Metodo2 ;<br>c(12, 4) ;<\/code><\/p>\n\n\n\n<p>Queda bastante claro c\u00f3mo el nuevo objeto <code>c<\/code> tiene asignada dos funciones: <code>M\u00e9todo1<\/code> y <code>Metodo2<\/code>. Observar c\u00f3mo se le agreg\u00f3 el <code>Metodo2<\/code> usando el operador <code>+=<\/code>; esta estrategia es v\u00e1lida para agregarle m\u00e1s funciones al delegado, hasta cansarnos.<\/p>\n\n\n\n<p>La salida por pantalla es:<\/p>\n\n\n\n<p><code>False<br>True<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Un ejemplo m\u00e1s fuerte::<\/h2>\n\n\n\n<p>Este ejemplo, aunque no es muy pr\u00e1ctico, transmite la idea de c\u00f3mo usar delegados para pasar funciones en los par\u00e1metros de otras funciones. Tenemos las siguientes funciones que pintan l\u00edneas de un punto a otro. Cada una lo hace de forma diferente.<\/p>\n\n\n\n<p><code>void LineaPuntos(Point uno, Point dos){\u2026}<\/code> \/\/ pinta la l\u00ednea con puntos equidistantes.<code><br>void LineaContinua(Point uno, Point dos){\u2026}<\/code> \/\/ pinta la l\u00ednea de forma continua.<code><br>void LineaAsterisco(Point uno, Point dos){\u2026}<\/code> \/\/pinta la l\u00ednea con asteriscos equidistantes.<\/p>\n\n\n\n<p>Ahora tenemos otros m\u00e9todos que dibujan figuras. En el caso del cuadrado traza desde cada uno de sus puntos una l\u00ednea al siguiente. El tri\u00e1ngulo se dibuja de igual manera, al igual que un rombo, un rect\u00e1ngulo y cualquier otra figura que se nos ocurra. Un c\u00edrculo lo podemos simular con l\u00edneas peque\u00f1as, por ejemplo.<\/p>\n\n\n\n<p>El problema llega cuando queremos tener la posibilidad de en tiempo de ejecuci\u00f3n poder decidir qu\u00e9 figura dibujar y c\u00f3mo queremos que dibuje sus l\u00edneas. Un m\u00e9todo <code>DibujaCuadrado<\/code> para cada uno de los tipos de l\u00edneas no es eficiente. Pues si son <em>n<\/em> tipos de l\u00edneas y <em>m<\/em> tipos de figuras ser\u00edan <em>n*m<\/em> m\u00e9todos. Podr\u00edamos tambi\u00e9n tener un par\u00e1metro <code>tipo_l\u00ednea<\/code> y, en dependencia de \u00e9ste, el m\u00e9todo <code>DibujaCuadrado<\/code> decide como dibujar la figura; pero est\u00e1 la situaci\u00f3n de que alguien redescubra (nos llegue en una DLL) una forma de pintar l\u00edneas con ceros o con signos diferentes, y tendr\u00edamos nuevamente que modificar a <code>DibujaCuadrado<\/code>&#8230; definitivamente muy chapucero. Este es el c\u00f3digo del m\u00e9todo <code>DibujaCuadrado<\/code> usando un delegado del tipo <code>Pintor<\/code>.<\/p>\n\n\n\n<p><code>delegate void Pintor(Point p, Point p2); <\/code>\/\/dibuja una l\u00ednea de p a p2.<code><br>public void DibujaCuadrado(Point inicial, int lado, Pintor p){<br>Point A = inicial;<br>Point B = new Point(inicial.x, inicial.y+lado);<br>Point C = new Point(inicial.x + lado, inicial.y + lado);<br>Point D = new Point(inicial.x + lado, inicial.y) ;<br>p(A, B) ;<br>p(B, C) ;<br>p(C, D) ;<br>p(D, A) ;<br>}<\/code><\/p>\n\n\n\n<p>Ahora podemos dibujar de una manera c\u00f3moda un cuadrado usando cualquier tipo de formato de l\u00edneas. S\u00f3lo tenemos que implementar los m\u00e9todos <code>LineaPuntos<\/code>, <code>LineaContinua<\/code> y <code>LineaAsterisco<\/code> y asign\u00e1rselo a nuestro gusto a un objeto de tipo <code>Pintor<\/code>; este objeto se lo pasamos a <code>DibujaCuadrado<\/code> y listo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusiones::<\/h2>\n\n\n\n<p>Ventajas de usar delegados:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Los delegados son similares a los punteros a funci\u00f3n de C++, pero poseen seguridad de tipos.<\/li>\n\n\n\n<li>Los delegados permiten pasar los m\u00e9todos como par\u00e1metros.<\/li>\n\n\n\n<li>Los delegados pueden utilizarse para definir m\u00e9todos de devoluci\u00f3n de llamada.<\/li>\n\n\n\n<li>Los delegados pueden encadenarse; por ejemplo, se puede llamar a varios m\u00e9todos en un solo evento.<\/li>\n\n\n\n<li>No es necesario que los m\u00e9todos coincidan exactamente con la firma de delegado.<\/li>\n\n\n\n<li>La versi\u00f3n 2.0 de C# introduce el concepto de m\u00e9todos an\u00f3nimos, que permiten pasar bloques de c\u00f3digo como par\u00e1metros en lugar de utilizar m\u00e9todos definidos independientemente.<\/li>\n<\/ol>\n\n\n\n<p>Los delegados se usan para implementar los eventos en .NET. Todos los botones tienen un delegado llamado <code>Click<\/code> de tipo <code>EventHandler<\/code> (este es el delegado como tal, instanciado dentro de la clase <code>Button<\/code>). Cuando queremos asignarle funconalidad a <code>miBoton<\/code> le asignamos un m\u00e9todo a su delegado de la siguiente manera:<\/p>\n\n\n\n<p><code>this.miBoton.Click += new System.EventHandler(this. miBoton_Click);<\/code><\/p>\n\n\n\n<p>\u00bfNunca les ha pasado que borran un el m\u00e9todo <code>_Click<\/code> y al compilar les da error en la l\u00ednea anterior? Es que ese m\u00e9todo estaba asignado a un delegado. Pueden borrar la l\u00ednea con confianza.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Para saber m\u00e1s&#8230;<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/msdn2.microsoft.com\/en-us\/vcsharp\/aa336809.aspx\" target=\"_blank\" rel=\"noreferrer noopener\">C# Language Specification<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/www.meshplex.org\/wiki\/C_Sharp_Tutorial\" target=\"_blank\" rel=\"noreferrer noopener\">Full C# Online book<\/a><\/li>\n<\/ul>\n\n\n\n<p>Escrito por Krlo [<a href=\"mailto:blackhat4all@gmail.com?Subject=Para Krlo\">blackhat4all@gmail.com<\/a>]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Los delegados son una herramienta de gran utilidad en .NET. Aunque son usados s\u00f3lo en casos muy espec\u00edficos,<\/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-491","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\/491","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=491"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/491\/revisions"}],"predecessor-version":[{"id":492,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/491\/revisions\/492"}],"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=491"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=491"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=491"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}