2012-07-07 38 views
19

Si busqué, definitivamente obtendré ejemplos de cómo mostrar un Delegado y una Acción. He leído los libros básicos con ejemplos de delegados.Cuál es la diferencia entre Delegate & Action en C#

Pero lo que quiero saber es su uso en el mundo real. Por favor, no den ejemplo Hello World o la clase Animal son demasiado básicas

Por ejemplo, :

  1. ¿Cuáles son las diferencias entre ellas
  2. Cuándo utilizar un delegado o acción
  3. Cuando no utilizar un delegado o acción
  4. Cuando pueden ser una más de matar
+3

Una acción es un delegado cuya firma no tiene parámetros y tiene sin valor de retorno – Siege

+0

Puedo buscar y leer el MSDN en este remolque. Pero lo que estoy buscando son simples ejemplos del mundo real para delegate & Action – HatSoft

+1

No puede usar 'Action' sin usar un delegado al mismo tiempo, ya que' Action' es un tipo de delegado específico. – CodesInChaos

Respuesta

22

Action es un Delegate. Se define así:

public delegate void Action(); 

Se puede crear sus propios tipos de delegado manera similar a cómo se crearía métodos abstractos; usted escribe la firma pero no implementa. Luego crea instancias de estos delegados tomando la referencia de un método.

class Program 
{ 
    public static void FooMethod() 
    { 
     Console.WriteLine("Called foo"); 
    } 

    static void Main() 
    { 
     Action foo = FooMethod; // foo now references FooMethod() 
     foo(); // outputs "Called foo" 
    } 
} 
17

Cuando defines un delegado, esencialmente defines la firma de un método (tipo de retorno y argumentos).

Una acción es un delegado que ya se ha definido (retorno nulo y sin argumentos).

public delegate void Action() 

Puede ir a la definición y verlo usted mismo. O aquí en los documentos. http://msdn.microsoft.com/en-us/library/system.action.aspx

casi siempre utilizan los delegados genéricos existentes (de los cuales la acción es uno) cuando la firma del método Estoy buscando coincidencias las firmas respaldadas. Lo bueno de utilizar los delegados genéricos es que son bien conocidos. La mayoría de los desarrolladores saben que una Acción es nula/vacía. Si tuviera que definir mi propia versión de Action, todos necesitarían buscar su firma, y ​​simplemente dupliqué algo que ya existe.

Por ejemplos ... La acción pasa a ser un poco más rara ya que el propósito de un método nulo/vacío solo puede ser para la mutación. Func es muy común (también un delegado genérico). Hay ejemplos de su uso en todo el marco, especialmente en linq. Mira, por ejemplo. http://msdn.microsoft.com/en-us/library/bb534803.aspx. Es un Func lo que significa que necesita un elemento del tipo de la colección en la que está trabajando como parámetro y devuelve un bool. En el contexto de la instrucción where que tiene el Func return true significa incluirlo en los resultados a la inversa para falso.

public static IEnumerable<TSource> Where<TSource>(
    this IEnumerable<TSource> source, 
    Func<TSource, bool> predicate 
) 
+1

Como dije, puedo buscar y leer MSDN pero necesito el ejemplo del mundo real – HatSoft

6

Desde Kenneth & asedio ya se ha indicado el código & MSDN simplemente voy a tratar de rellenar con el ejemplo del mundo real.

Considere un delegado que define "mover".

Un delegado de 'Acción' en el mundo real sería 'Ejecutar' o 'Andar'. No te importa a qué velocidad te mueves, qué ruta tomas o informas el tiempo que te tomó mudar.

Un delegado que no es de Acción podría, por ejemplo, definir a qué velocidad se ejecuta y devolver el tiempo que llevó completarlo.

public delegate void MoveAction(); 
public delegate int MoveDelegate(int speed); 

Ampliación ejemplos de asedio ..

class Program 
{ 
    public static void Run() 
    { 
     Console.WriteLine("Running"); 
    } 

    public static int RunAtSpeed(int speed) 
    { 
     // logic to run @ speed and return time 
     Console.WriteLine("Running @ {0}", speed); 
     return 10; 
    } 

    public static int WalkAtSpeed(int speed) 
    { 
     // logic to walk @ speed and return time 
     Console.WriteLine("Walking @ {0}", speed); 
     return 20; 
    } 

    static void Main() 
    { 
     Action foo = Run; 
     foo(); 

     MoveDelegate run = RunAtSpeed; 
     int result1 = run(5); 

     MoveDelegate walk = WalkAtSpeed; 
     int result2 = walk(1); 
    } 
} 
3

¿Qué es Acción: Sencillamente acción, Func> <, determinantes todos son del tipo de delegado.

por eso que necesitamos Acción: Acción encapsula diferente número de parámetros y diferente tipo de tipo de retorno que sean suficientes para el desarrollo de aplicaciones en muchos casos. Estos se proporcionan en el espacio de nombres del sistema. Usted es libre de crear su propio delegado.

Tenga en cuenta que hay 17 tipos diferentes de Acción y Func cada uno con cero a 16 argumentos genéricos con parámetros.

La acción siempre no tiene valor de retorno. Func tiene un único tipo de retorno genérico parametrizado.

EN MIEMBRO, El delegado de predicados no era necesario para ser definido como realmente equivalente a Func que toma una arg y devuelve bool.

1

El código de ejemplo del mundo real que se ha solicitado repetidamente, ya ha sido proporcionado en una respuesta anterior por el usuario "Console.WriteLine".

En cuanto a por qué se ha proporcionado, por lo que he entendido, Action es una forma de ahorrar para seguir definiendo nuevos delegados. Dado que es un delegado predefinido de tipos de firma particulares, se ahorra la molestia de crear diferentes delegados para cada fin previsto. Simplemente use el delegado de Acción predefinido para señalar sus métodos y ejecutarlos. Lo mismo es el caso con los delegados de Func.

Más de una conveniencia realmente, en lugar de una nueva funcionalidad real. Ayuda a mantener su código corto y comprensible, con menos problemas.

En cuanto a sus preguntas puntuales a gota,

  1. ¿Cuáles son las diferencias entre ellas

No hay diferencia. Action es un delegado predefinido, pensado para ahorrarte la molestia de definir repetidamente nuevos delegados.

  1. Cuándo utilizar un delegado o acción

Típicamente, un delegado (y acción) se utiliza en los lugares donde se necesita tener una funcionalidad basada en tablas. es decir, tal vez un diccionario de métodos correspondiente a algún requisito particular. Tenga en cuenta que el uso de Acción hace que sea fácil cambiar el método final llamado, para apuntar a algún otro método de forma dinámica (¿tal vez en función de algunas configuraciones seleccionadas por el usuario?)


class Program 
{ 
    static void Main() 
    { 
    Dictionary<string, Action> dict = new Dictionary<string, Action>(); 
    dict["loadFile"] = new Action(LoadFile); 
    dict["saveFile"] = new Action(SaveFile); 

    dict["loadFile"].Invoke(); 
    dict["saveFile"].Invoke(); 
    } 

    static void SaveFile() 
    { 
    Console.WriteLine("File saved!"); 
    } 

    static void LoadFile() 
    { 
    Console.WriteLine("Loading File..."); 
    } 
} 

Otro uso típico es para los métodos de devolución de llamada. Ejemplo sería cuando usa una clase BubbleSort, pasando el método de comparación como un delegado a la clase, que sería utilizado por la clase BubbleSort para permitir que su código defina la lógica de comparación, mientras se ocupa de todo lo demás. Esto también se puede usar a partir de los hilos que ha iniciado, y el hilo llama al delegado cuando se deben informar algunas acciones intermedias a su código.

Puede consultar esta publicación SO para ver un gran ejemplo de lo anterior. https://stackoverflow.com/a/3794229/1336068

  1. Cuando no utilizar un delegado o acción

La única razón que se me ocurre no usarlos cuando la situación lo exige, es decir, si su el delegado va a ser llamado millones de veces en una corta duración. Hay una ligera sobrecarga involucrada, y si esto está causando un retraso en la aplicación, entonces puede que tenga que encontrar una mejor manera de resolver esto usando referencia directa a sus funciones, en lugar de a través de un delegado.

  1. Cuando pueden ser una más de matar

cuando se utilizan a título gratuito y sin ninguna necesidad real. De lo contrario, en la mayoría de las situaciones, pueden ser una forma elegante de resolver los escenarios anteriores.

Además, lea este SO respuesta para ver las diferencias entre los métodos normales, los delegados a obtener una mejor comprensión de dónde utilizar los delegados/acción/func https://stackoverflow.com/a/17380580/1336068

+0

buen intento. un poco largo aliento – Louis

Cuestiones relacionadas