- Action<T> 委托
封装一个方法,该方法只采用一个参数并且不返回值。
可以使用此委托以参数形式传递方法,而不用显式声明自定义的委托。该方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能返回值。(该方法必须返回 void) 通常,这种方法用于执行某个操作。
以下示例所用的方法是实例化 Action<T> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。(MSDN)
也可以按照以下示例所演示的那样在 C# 中将 Action<T> 委托与匿名方法一起使用
也可以按照以下示例所演示的那样将 lambda 表达式分配给 Action<T> 委托实例
- Func<T,TResult> 委托
封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。
可以使用此委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托。该方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具有一个通过值传递给它的参数,并且必须返回值。
以下示例所用的方法是实例化 Func<T, TResult> 委托,而不是显式定义一个新委托并将命名方法分配给该委托。
也可以按照以下示例所演示的那样在 C# 中将 Func<T, TResult> 委托与匿名方法一起使用
也可以按照以下示例所演示的那样将 lambda 表达式分配给 Func<T, TResult> 委托
Lambda 表达式的基础类型是泛型 Func 委托之一。这样能以参数形式传递 lambda 表达式,而不用显式将其分配给委托。尤其是,因为 System.Linq 命名空间中许多类型方法具有 Func<T, TResult> 参数,因此可以给这些方法传递 lambda 表达式,而不用显式实例化 Func<T, TResult> 委托。
- 多播委托
前面使用的每个委托都只包含一个方法电泳。调用委托的次数与调用方法的次数相同。如果调用多个方法,就需要多次显示调用这个委托。但是,委托也可以包含多个方法。这种委托诚挚为多播委托。如果调用多播委托,就可以按顺序连续调用多个方法。为此,委托的签名就必须返回void,否则,就只能得到委托调用的最后一个方法的结果。
多播委托通过"+=" 和 "-="从委托中增加或删除方法调用
在多个委托被调用的时候可能中间某此调用出现异常而导致整个多播委托停止,为避免这种情况,Delegate累定义GetInvocationList()方法,它返回一个Delegate对象数组。如下面的例子: