2009-03-11 22 views
9

Siempre estoy buscando una manera de usar todas las herramientas que pueda y estirarme más allá de donde estoy. Pero por mucho que haya leído acerca de los delegados, nunca puedo encontrar un lugar para usarlos (como interfaces, genéricos y muchas cosas, pero estoy divagando.) Esperaba que alguien pudiera mostrarme cuándo y cómo usaron un delegado. en web programación para asp.net C# (2.0 y superior).¿Cuándo usaría un delegado en asp.net?

Gracias y si esto es incorrecto para Stack Overflow, solo házmelo saber.

+0

ver también un general q: http://stackoverflow.com/questions/31497/where-do-i-use-delegates – nawfal

Respuesta

7

bdukes tiene razón sobre los eventos. Pero no está limitado a usar delegados con eventos.

Estudie el patrón Observer clásico para obtener más ejemplos sobre el uso de delegados. Algunos textos sobre el patrón apuntan hacia un modelo de evento, pero desde una perspectiva de aprendizaje en bruto, no es necesario usar eventos.

Una cosa para recordar: Un delegado es simplemente otro tipo que se puede usar & pasado similar a sus tipos primitivos como un "int". Y al igual que "int", un delegado tiene sus propias características especiales sobre las que puede actuar en la codificación cuando consume el tipo de delegado.

Para obtener un manejo realmente bueno sobre el tema y en algunos de sus aspectos más avanzados y detallados, obtenga el libro de Joe Duffy, .NET Framework 2.0.

5

Bueno, cada vez que maneja un evento, está utilizando un delegado.

3

Para responder a su segunda pregunta primero, creo que esta es una gran pregunta para StackOverflow.

En la primera, un ejemplo sería la clasificación. El método Sort() en List toma un delegado para hacer la clasificación, al igual que el método Find(). No soy muy partidario de clasificar la base de datos, por lo que me gusta utilizar Sort() en mis conjuntos de resultados. Después de todo, el orden de una lista es mucho más un problema de IU (generalmente) que un problema de regla empresarial.

Editar: He añadido mis razones para ordenar fuera de la base de datos a la pregunta correspondiente here.

Editar: La función de comparación utilizada en la rutina de clasificación es un delegado. Por lo tanto, si ordena una Lista usando el método .Sort (Comparación (T)), el método de Comparación (T) que pasa a la función de clasificación es un delegado. Consulte la .Sort (Comparación (T)) documentation.

+0

sólo por curiosidad: ¿Qué pasa sobre la ordenación en la base de datos? –

+0

No hay absolutamente nada de malo en ordenar el DB; de hecho, con gran cantidad de información, no lo hará sin hacerlo – eglasius

+0

@Adrian: no me suscribo a esta vista, pero los que sí muestran tres puntos: 1) Normalmente, el db soporta la carga pesada, mientras que los clientes tienen una CPU adicional. Si puede mover la clasificación al cliente, entonces puede mejorar la escalabilidad. [continúa] –

1

Otro ejemplo sería publicar eventos para controles de usuario.

Por ejemplo.

// In your user control 
public delegate void evtSomething(SomeData oYourData); 
public event evtSomething OnSomething; 

// In the page using your user control 
ucYourUserControl.OnSomething += ucYourUserControl_OnSomething; 

// Then implement the function 
protected void ucYourUserControl_OnSelect(SomeData oYourData) 
{ 
    ... 
} 
2

Otro ejemplo rápido de la cabeza sería la prueba de unidades con Rhino Mocks. Muchas de las cosas que puede hacer con Rhino Mocks utilizan delegados y expresiones lambda.

1

Recientemente utilicé a los delegados para "delegar" la verificación de los permisos.

public Func CheckPermission;

De esta manera, la función CheckPermission puede ser compartida por varios controles o clases, por ejemplo en una clase estática o una clase de utilidades, y aún así ser administrada centralizada, evitando también la explosión de la interfaz; solo un pensamiento

1

Puede usar delegados cada vez que sepa que deseará tomar alguna medida, pero los detalles de esa acción dependerán de las circunstancias.

Entre otras cosas, se utiliza delegados para:

  • Clasificación y filtrado, especialmente si el usuario puede elegir entre diferentes criterios de clasificación/filtrado
  • código simplificación. Por ejemplo, un proceso largo donde el principio y el final son siempre los mismos, pero un pequeño punto medio varía. En lugar de tener un bloque difícil de leer en el medio, tengo un método para todo el proceso y paso un delegado (Acción) para el bit del medio.
  • Tengo un método ToString muy útil en mi capa de presentación que convierte una colección de cualquier cosa en una lista separada por comas. Los parámetros del método son un delegado IEnumerable y Func para convertir cada T en la colección en una cadena. Funciona igual de bien para encadenar Usuarios por su Nombre o para enumerar Proyectos por su ID.
Cuestiones relacionadas