一、Action<T> 与Func<T>
除了使用自定义的委托之外,还可以使用 Action<T> 与Func<T> 委托,Action<T> 定义了一个无返回值,参数是T类型的委托,非泛型Action表示无参数无返回值。Func<T>表示有返回值的委托。使用时,返回值的类型在最后声明。
下面给出示例:
public class TestDele
{
// 声明了有一个无参数无返回值的委托引用
public Action myDelegate;
// 声明了有一个 int 类型参数,无返回值的委托引用
public Action<int> myDelegate1;
// 声明了有一个 int 类型参数,string 类型返回值的委托引用
public Func<int,string> myDelegate2;
public TestDele()
{
// 初始化委托
myDelegate2 = GetStringByNumber;
// 调用委托
string result = myDelegate2(10); // result = "10";
}
public string GetStringByNumber(int num)
{
return num.ToString();
}
}
二、多播委托
一个委托可以引用很多符合条件的方法,这种委托称为多播委托。如果使用多播委托就可以按顺序调用多个方法。
注意:
1、多播委托有返回值时,返回的是最后一个调用的方法的结果。如果前面的方法抛出了异常,方法调用会停止。
2、委托可以识别 + 和 - 运算符(也支持 += 和 -=),分别表示增加和删除方法,运算符的一方必须是委托,另一方可以是委托也可以是方法名。
下面给出示例:
public class A
{
public Func<int> a;
Func<int> b;
Func<int> c;
public Func<int> d;
public A()
{ // "+"用来增加方法,"-"用来删除方法
// 使用 "+" 连接一个委托和一个方法名
a = GetNum;
a += GetNum1;
a += GetNum2;
a -= GetNum2;
// 使用 "+" 连接两个委托
b = GetNum;
c = GetNum1;
d = b + c;
}
public int GetNum()
{
return 0;
}
public int GetNum1()
{
return 1;
}
public int GetNum2()
{
return 2;
}
}
下面给出调用示例:
// 声明并调用构造函数初始化
A dele = new A();
int a = dele.a(); // a = 1
int d = dele.d(); // d = 1