2009-10-22 13 views
6

1) ¿Cuál es la definición real de delegada de acción? algunas definiciones lo describen como mapa condicional polimórfico, algunos dicen que * Tabla de decisión aplicada *.Información sobre delegado de acción en C#

(Puede preguntar qué logrará si conoce la definición, si la conozco puedo entender su verdadero propósito).

2) Gracias Binary Worrier, Andrew Hare de stackoverflow por dar buenos ejemplos. Cuando me declaro

string[] words = "This is as easy as it looks".Split(' '); 
`Array.ForEach(words, p => Console.WriteLine(p));` 

puedo entender lo que realmente does.But cuando me declaro, ¿cómo C# interpretan cuando me declaro

 Dictionary<SomeEnum, Action<User>> methodList = 
    new Dictionary<SomeEnum, Action<User>>() 
    methodList.Add(SomeEnum.One, DoSomething); 
    methodList.Add(SomeEnum.Two, DoSomethingElse); 

lo hace almacenar colecciones de acciones en el diccionario? .unfortunately como el ejemplo estaba incompleto, no lo entendí.

3) ¿Cuál es la diferencia funcional entre Action , Function ,Predicate delagets?

+0

ver respuesta aquí http://stackoverflow.com/questions/566860/delegates-predicate-action-func – BlackTigerX

Respuesta

11

Es simplemente otro delegado. Action<T> se declara así:

void Action<T>(T item) 

Es sólo "algo que actúa sobre un solo elemento". Hay sobrecargas genéricas con más parámetros de tipo y parámetros normales. En sí mismo, un Action<T> no es una tabla de decisiones aplicada ni nada por el estilo; es solo un delegado que puede hacer "algo" con un elemento.

El ejemplo de diccionario es simplemente un diccionario con valores enum como claves y acciones como valores, de modo que puede buscar qué hacer basándose en el valor enum y luego pasar una referencia User para que actúe.

En cuanto a Func vs vs ActionPredicate: Func es como Action, pero devolver un valor. Predicate es similar, pero siempre devuelve bool, y no existe el rango de sobrecargas genéricas, solo Predicate<T> para determinar si un elemento "coincide" con el predicado.

2

Acción, Func y predicado tienen diferentes firmas:

vacío Acción <...> (...)
T Func < ..., T > (...) Predicado
bool <T> (T)

Acción <...> es igual que Func < ..., nula >
predicado < T> es lo mismo que Func < T, bool >

2

1) la acción de los delegados

(Action, Action<T>, Action<T, T2> ...) 

son delegado de propósito general para evitar la creación de muchos de delegado en su aplicación. La idea es:

//- Action => void method with 0 args 
//- Action<T> => void method with 1 arg of type T 
//- Action<T, T2> => void method with 2 args of type T et T2 
//... 

2) que las tiendas de diccionario para los valores de cada uno 'SomeEnum', un método wicth coincide con esta firma:

void MethodExample (User arg); 

Aquí se muestra un ejemplo:

public Init() { 
    deleteUserMethodsByStatus = new Dictionary<SomeEnum, Action<User>>(); 
    deleteUserMethodsByStatus.Add(UserStatus.Active, user => { throw new BusinessException("Cannot delete an active user."); }); 
    deleteUserMethodsByStatus.Add(UserStatus.InActive, DoUserDeletion}); 
} 

//This is how you could use this dictionary 
public void DeleteUser(int userId) { 
    User u = DaoFactory.User.GetById(userId); 
    deleteUserMethodsByStatus[u.Status](u); 
} 

//the actual deletion process 
protected internal DoUserDeletion(User u) { 
    DaoFactory.User.Delete(u); 
} 

3) Diferencia entre Acción, Función, Predicado: - una acción es un método nulo (sin valor de retorno) - una función es un método no nulo (tiene un valor de retorno) - un predicado debe devolver un valor booleano y tomar 1 argumento (básicamente, respondió si o no a la pregunta que toma 1 argumento)

Espero que esta ayuda.

+0

Absoultely es muy útil – user193276

Cuestiones relacionadas