Подробности о делегате действий в C # - PullRequest
6 голосов
/ 22 октября 2009

1) Каково реальное определение для делегата Action ? некоторые определения описывают это как полиморфная условная карта , некоторые говорят, что * Таблица прикладных решений *.

( Вы можете спросить, чего вы достигнете, зная определение, если я знаю его, я пойму его истинное назначение) .

2) Спасибо Binary Worrier, Andrew Hare из stackoverflow за прекрасные примеры. Когда я объявляю

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

Я могу понять, что он на самом деле делает. Но когда я объявляю, как C # интерпретирует, когда я объявить

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

Хранит ли он наборы действий в словаре?. К сожалению, так как пример был неполным, я не получил его.

3) В чем функциональная разница между Action , Function ,Predicate делагетами?

Ответы [ 3 ]

11 голосов
/ 22 октября 2009

Это просто еще один делегат. Action<T> объявлено так:

void Action<T>(T item)

Это просто "что-то, что действует на один предмет". Существуют общие перегрузки с большим количеством параметров типа и нормальных параметров. Сам по себе Action<T> не является приложенной таблицей решений или чем-то в этом роде - это просто делегат, который может «что-то» делать с элементом.

Пример словаря - это просто словарь со значениями перечисления в качестве ключей и действиями в качестве значений - так что вы можете посмотреть, что делать, основываясь на значении перечисления, а затем передать ссылку User, чтобы он действовал.

Что касается Func против Action против Predicate: Func похоже на Action, но возвращает значение. Predicate аналогичен, но всегда возвращает bool, и диапазон общих перегрузок отсутствует, просто Predicate<T>, чтобы определить, соответствует ли элемент «предикату».

2 голосов
/ 22 октября 2009

1) Акция делегатов

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

- это делегат общего назначения, чтобы избежать создания множества делегатов в вашем приложении. Идея такова:

//- 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) этот словарь хранит для каждого значения SomeEnum, метод, соответствующий этой подписи:

void MethodExample (User arg);

Вот пример:

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) Разница между действием, функцией, предикатом: - действие является пустым методом (без возвращаемого значения) - функция не является пустым методом (имеет возвращаемое значение) - предикат должен возвращать логическое значение и принимать 1 аргумент (в основном он отвечает да или нет на вопрос, который принимает 1 аргумент)

Надеюсь, это поможет.

2 голосов
/ 22 октября 2009

Action, Func и Predicate имеют разные подписи:

Пустое действие <...> (...)
T Func <..., T> (...)
Предикат bool (T)

Действие <...> аналогично Func <..., void>
Предикат совпадает с Func

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...