C#中的标准委托

51

在C#中有一些预定义的委托。

我知道其中的几个:

EventHandler // Default event callbacks
EventHandler<T> // Default event callbacks with custom parameter (inheriting from EventArgs)
Action // Function without return value and without parameter
Action<T1, T2, T3, T4> // Function without return value and 1-4 parameters
Func<T1, T2, T3, T4, TResult> // Methos with 0-4 parameters and one result type
Predicate<T> // equivalent to Func<T, bool>

除了框架特殊情况和生成的表单部分外,还有许多其他用途,但在自己编写代码时使用这些通常很好。

如果您知道更多有用的内容,请添加。否则,这就是答案。


5
希望将此内容重新开放,并将其转换为社区维基页面。 - Tarion
6个回答

29

在C#中,它们并没有预定义,而是由框架进行定义。

ActionFunc委托族比你展示的更广泛——它们一直延伸到最大数量。

Action<T1, T2, T3, T4>

Func<T1, T2, T3, T4, TResult>

.NET 2.0中在使用LINQ之前用于列表操作的另一个常见方法是Predicate<T>

用于线程处理:

ThreadStart
ParameterizedThreadStart
WaitCallback
TimerCallback
AsyncCallback

不过这确实让人想到一个问题,如果泛型和 Func / Action 在 1.0 中就可用,我们是否会有其他委托类型呢? - JaredPar
这是一个有趣的问题。例如,与Func<T,bool>相比,我更喜欢Predicate<T>作为更有意义的名称 - 如果不是因为Where等重载需要使用Func<T,int,bool>,它将更适合于LINQ。在任何地方指定类型参数都可能会影响可读性。 - Jon Skeet

5

我喜欢使用Predicate<T>,它等同于Func<T, bool>


2
我也遇到过
Comparison<T> 

in the

List.Sort(Comparison<T>)

通用方法。我认为现在这等同于:

Func<T1, T2, int> 

2
前往Reflector,搜索System.MulticastDelegate并检查派生类型。您将获得您要查找的所有委托列表。

那提供了一个完整的委托列表。但它并没有提供最有用或最重要的那些,这才是OP想要的东西。 - Jon Skeet

0

我经常使用WaitCallbackThreadStart,因此它们值得一提。

如果您知道所需委托的签名,但不知道是否有一个具有该签名且可用的现有委托,您可以按照我的博客中这些说明进行查找。


链接似乎已经失效。 - user1725145

0

System.Windows.ValidateValueCallback代表一个方法,用作回调函数,用于验证依赖属性的有效值。

阅读更多:MSDN: ValidateValueCallback委托


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接