2012-06-13 23 views
10

De MSDN doc:patrón Delegado vs palabra clave delegado en C#

Un delegado es un tipo que encapsula un método con seguridad, similar a un puntero función en C y C++. A diferencia de los punteros de función C, los delegados están orientados a objetos, tipo seguros y seguros.

Sé lo que es y cómo usarlo. Pero me pregunto si está escrito o no en el patrón de delegado que conozco (de wikipedia).
¿Cuál es la diferencia entre ellos?

Respuesta

5

El C# (no el patrón) delegado podría ser útil cuando se está implementando la delegate pattern tan sólo mirar a esta implementación patrón delegado de Wikipedia con mis cambios:

//NOTE: this is just a sample, not a suggestion to do it in such way 

public interface I 
{ 
    void F(); 
    void G(); 
} 

public static class A 
{ 
    public static void F() { System.Console.WriteLine("A: doing F()"); } 
    public static void G() { System.Console.WriteLine("A: doing G()"); } 
} 

public static class B 
{ 
    public static void F() { System.Console.WriteLine("B: doing F()"); } 
    public static void G() { System.Console.WriteLine("B: doing G()"); } 
} 

public class C : I 
{ 
    // delegation 
    Action iF = A.F; 
    Action iG = A.G; 

    public void F() { iF(); } 
    public void G() { iG(); } 

    // normal attributes 
    public void ToA() { iF = A.F; iG = A.G; } 
    public void ToB() { iF = B.F; iG = B.G; } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     C c = new C(); 
     c.F();  // output: A: doing F() 
     c.G();  // output: A: doing G() 
     c.ToB(); 
     c.F();  // output: B: doing F() 
     c.G();  // output: B: doing G() 
    } 
} 

vez delegar podría ser útil en este caso, pero no es porque fue introducido. Debería verlo como en la construcción de bajo nivel en lugar del patrón. En el par con el events que podría ser utilizado para implementar publisher/subscriber(observer) pattern - basta con ver this article, o que a veces se podría ayudar a poner en práctica visitor pattern - esto se utiliza activamente en la LINQ:

public void Linq1() 
{ 
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 

    // n => n < 5 is lambda function, creates a delegate here 
    var lowNums = numbers.Where(n => n < 5); 

    Console.WriteLine("Numbers < 5:"); 
    foreach (var x in lowNums) 
    { 
     Console.WriteLine(x); 
    } 
} 

En resumen: una El delegado de idioma no es el patrón en sí mismo, solo le permite operar funciones como first class objects.

+0

Muchas gracias, muy claro – R4j

0

El patrón de delegación es una forma de que un objeto delegue la responsabilidad de una tarea en un método externo. Utiliza un delegado para realizar un seguimiento de ese método. Entonces un uso para un delegado es implementar el patrón de delegación .

El patrón se utiliza, por ejemplo, en el método List<T>.Sort(comparison), donde el algoritmo de clasificación utiliza un delegado que usted le proporciona para comparar elementos.

2

El delegation pattern es:

un patrón de diseño [...] donde un objeto, en lugar de realizar una de sus tareas declaradas, los delegados esa tarea a un objeto auxiliar asociado.

Desafortunadamente, esa página no describe mucho acerca de cuándo usarlo o qué patrones se derivan de ella, aparte de

El patrón de la delegación es uno de los patrones de abstracción fundamentales que subyacen a otros patrones de software, como composición (también conocida como agregación), mixins y aspectos.

Desde la página que describes delegation, se puede averiguar que es delegar la ejecución de una función para una clase que pueden o no ser conocido en tiempo de ejecución.Cuando dice Foo.Bar(), la implementación de eso puede delegar la ejecución de Bar() en el "objeto auxiliar" antes mencionado.

Ahora para el delegado C#, como se dijo, eso es simplemente un puntero a la función. Puede ayudar a implementar un patrón de delegación, asignando el método de delegación en tiempo de compilación o tiempo de ejecución.