关于C#中的Action代理的详细信息

时间:2009-10-22 06:52:40

标签: c# delegates

1)行动委托的真正定义是什么?一些定义描述它是 多态条件映射 ,有人说它 *应用决策表*。

你可能会问你通过了解定义会得到什么,如果我知道它可以理解它的真实目的)

2)感谢Binary Worrier,来自stackoverflow的Andrew Hare给出了很好的例子。     当我宣布

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);

它是否在字典中存储了Actions的集合?。不幸的是,由于示例不完整,我没有得到它。

3)Action , Function ,Predicate延迟之间的功能差异是什么?

3 个答案:

答案 0 :(得分:11)

这只是另一位代表。 Action<T>声明如下:

void Action<T>(T item)

这只是“对单个项目起作用的东西”。存在具有更多类型参数和正常参数的泛型重载。就其本身而言,Action<T>不是一个应用的决策表或类似的东西 - 它只是一个可以对项目做“某事”的委托。

字典示例只是一个字典,其中枚举值为键,操作为值 - 因此您可以根据枚举值查找要执行的操作,然后传入User引用以进行操作上。

至于Func vs Action vs PredicateFuncAction类似,但返回一个值。 Predicate类似,但始终返回bool,并且没有泛型重载的范围,只有Predicate<T>来确定项是否与谓词“匹配”。

答案 1 :(得分:2)

Action,Func和Predicate有不同的签名:

无效动作&lt; ...&gt;(...)
T Func&lt; ...,T&gt;(...)
bool谓词&lt; T&gt;(T)

动作&LT; ...&GT;与Func&lt; ...,void&gt;相同 谓词&LT; T&GT;与Func&lt; T,bool&gt;

相同

答案 2 :(得分:2)

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)动作,功能,谓词之间的区别: - 一个动作是一个void方法(没有返回值) - 函数是非void方法(具有返回值) - 一个谓词必须返回一个布尔值并取一个参数(它基本上是回答是或否,以问一个参数)

我希望这有帮助。