He estado investigando sobre delegados en C# pero la verdad no me queda tan claro aún.
¿Alguien puede explicarme de qué trata?
He estado investigando sobre delegados en C# pero la verdad no me queda tan claro aún.
¿Alguien puede explicarme de qué trata?
Un delegado es, en resumen, un apuntador a una función.
Es decir imagina que puedes crear una función y asignarla a una variable para pasarla como parámetro donde tu necesites. Desde luego heredando todas las características del CLR entre ellas la seguridad y strong typing (fuertemente tipado).
Un delegate es un tipo de referencia que puede utilizarse para encapsular un método con nombre o anónimo.Los delegados son similares a los punteros a funciones de C++, pero son más seguros y proporcionan mayor seguridad de tipos
msdn: Delegados (Guía de programación de C#)
Un delegado es un tipo que representa referencias a métodos con una lista de parámetros determinada y un tipo de valor devuelto. Cuando se crea una instancia de un delegado, puede asociar su instancia a cualquier método mediante una firma y un tipo de valor devuelto compatibles. Puede invocar (o llamar) al método a través de la instancia del delegado.
Ejemplo (msdn)
using System;
public class SamplesDelegate {
public delegate String myMethodDelegate( int myInt );
public class mySampleClass {
public String myStringMethod ( int myInt ) {
if ( myInt > 0 )
return( "positive" );
if ( myInt < 0 )
return( "negative" );
return ( "zero" );
}
public static String mySignMethod ( int myInt ) {
if ( myInt > 0 )
return( "+" );
if ( myInt < 0 )
return( "-" );
return ( "" );
}
}
public static void Main() {
mySampleClass mySC = new mySampleClass();
myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
}
}
/*
This code produces the following output:
5 is positive; use the sign "+".
-3 is negative; use the sign "-".
0 is zero; use the sign "".
*/
Un delegado es un objeto que contiene una referencia a un método.
Para crear un delegado es necesario indicar cuáles son los parámetros y el tipo de retorno, por ejemplo:
delegate double Operacion(double x);
Operacion
es compatible con cualquier método que regrese un double
y tenga solo un parámetro de tipo double
, como este:
static double Cuadrado(double x) { return x * x; }
Al asignar un método a una variable de tipo Operacion
se crea una instancia del delegado:
Operacion op = Cuadrado;
finalmente podemos usar esa instancia para invocar al método al que hace referencia:
double resultado = op(4); // 16
En C# los delegados son comúnmente utilizados en eventos y como callbacks para comunicar distintas partes de una aplicación de manera dinámica. Los callbacks y los delegados son tan comunes que en C# 3 se añadió una nueva sintaxis más compacta en la forma de expresiones lambda para representar a un delegado:
// Delegado anterior en forma de expresión lambda
Operacion op = x => x * x;
A pesar de que el comportamiento de delegado se puede emular con una interfaz, éstos tienen una característica adicional llamada multicasting que significa que una sola instancia puede hacer referencia a más de un método, por ejemplo:
MiDelegado d = Metodo1;
d += Metodo2; // Añade un nuevo método a la lista del delegado
Ahora al invocar d
ambos métodos serán llamados, el orden en que se llaman es igual al orden en que son añadidos a la lista del delegado.
Un claro ejemplo del uso de los delegados y callbacks es LINQ, el tipo List<T>
tiene muchos métodos que aceptan un delegado (o expresión lambda) y realizan distintas acciones:
List<int> numeros = Enumerable.Range(1, 200).ToList();
var impares = numeros.Find(n => n % 2 == 1);
En este caso el método Find
acepta un tipo delegado con un argumento int
y tipo de retorno bool
, a través de este callback encontramos los números impares en la lista.
Un delegado es la forma que te permite c# para declarar tipos cuya función es la de puntero a función. Un delegado permite asignar una firma a un nombre, de tal forma que todas las variables que se creen basadas en dicho nombre sean capaces de almacenar punteros a funciones compatibles con dicha firma.
Una variable basada en un delegado puede apuntar tanto a funciones miembro de una clase como a una lambda
.
¿Qué sentido tiene usar delegados? La alternativa sería escribir la firma en cada uso en vez del delegado. Fíjate por ejemplo en lenguajes de más bajo nivel como c o c++. En estos casos no existe el concepto de delegado como tal. Sin embargo como escribir la firma de la función en múltiples sitios crea código complicado de gestionar se opta por asignarle un alias a la función mediante typedef
o el más reciente using
(en c++11). Estos alias serían el equivalente al delegado de c#.
Utilización de delegados
La función de los delegados es permitirte manipular o trabajar con objetos dentro de otros hilos dentro de tu aplicación de lo contrario al intentar acceder te devolvería un error o al menos es para lo que suelo usar delegados.
Espero haberte ayudado saludos.
Más que analogia, no se si te sirve lo que son para mi en simples palabras: un delegado te permite enviar un método como parámetro a otro método.
según msdn :
Un delegado es un tipo que define una firma de método y se puede asociar a cualquier método con una firma compatible. Puede invocar (o llamar) al método a través del delegado. Los delegados se utilizan para pasar métodos como argumentos a otros métodos. Los controladores de eventos no son más que métodos que se invocan a través de delegados.
ejemplo:
//Declaramos
public delegate void stackOverFlowEsDelegado(string mensaje, int cantidadVeces);
//Instanciamos
stackOverFlowEsDelegado delegadoDeEjemplo = new stackOverFlowEsDelegado(stackOverFlowEs);
//invocamos
delegadoDeEjemplo("ejemplo de delegado en stackoverflow ES", 5);
En este articulo, tienes un buen ejemplo de delegado delegados C# ejemplo
Un delegado en C# es como un tipo de dato que apunta a un método permitiéndonos así extender las capacidades de nuestro código o permitir que otros lo hagan. La forma de declarar un delegado es de la siguiente manera: delegate ().