委托
1.什么是委托?
C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。
下面就定义一个委托,以及相应的两个方法。
public class DelegateTest
{
public delegate int GetNum(int num1);//声明的这个委托方法可以委托所有1个int入参返回值为int的方法
int num = 10;
public int AddNum(int a)
{
num = a + num;
return num;
}
public int LinkNum(int a)
{
num = a * num;
return num;
}
//匿名委托
public string NiMingDelegate(int a ,int b)
{
return "返回的是" + (a + b);
}
}
static void Main(string[] args)
{
DelegateTest delegateTest = new DelegateTest();
DelegateTest.GetNum getNum1 = new DelegateTest.GetNum(delegateTest.AddNum);
DelegateTest.GetNum getNum2 = new DelegateTest.GetNum(delegateTest.LinkNum);
Console.WriteLine(getNum1(1));//11 这里不用多说10+1=11
Console.WriteLine(getNum2(2));//22 这里不是10*2=20,而是11*2=22,可以理解成,DelegateTest里的num参数,先参与getNum1的计算值被修改成11,再参与getNum2中的计算,成了11*2
//委托的多播
DelegateTest.GetNum getNumMore = getNum1;
getNumMore += getNum2;
Console.WriteLine(getNumMore(3));//75 这里是75,其实是 (3+22)*3=75,等于是把getNum1和getNum2在执行了一次
//当然,如果getNum1和getNum2,只是利用num参与计算,并没有对num赋值,就没这种效果,那getNumMore其实就是getNum2的值,是3*10=30。
//还可以匿名方法,这种就是把方法的定义部分省略了。
DelegateTest.GetNum getNum3 = delegate (int i)
{
return i;
};
Console.WriteLine(getNum3(1));
//还有更懒的匿名方式,关键字都省了,用lambda表达式
DelegateTest.GetNum getNum4 = (int i) => { return i; };
Console.WriteLine(getNum3(2));
//匿名委托Func,最后一个参数是返回值,参数数量为1~5
Func<int, int, string> Func1 = new Func<int, int, string>(delegateTest.NiMingDelegate);
Console.WriteLine(Func1(3, 6));
//也可以这么写,把new Func<int, int, string>省了,但是在编译时系统会自动加上...
Func1 = delegateTest.NiMingDelegate;
Console.WriteLine(Func1(3, 7));
//匿名委托Action action ,用法和Func一样,只是没有返回值,参数数量为0~4
}
Func示例:
定义一个方法用来演示Func,因为我引用这个方法的代码放在静态类里,所有这里加上了static关键字
public static string FuncTest(int paramA,string paramB) { return "Func演示"; }
调用
Func<int, string, string> func = new Func<int, string, string>(FuncTest); string result = func(1, "123");
Lamada写法更简单
Func<int, string, string> func2 = (paramA, paramB) => { return "Func演示"; };
Action示例:
其实就是没有返回值的Func
Action<int, string> action = (paramA, paramB) => { int paramC = paramA + 1; };
2.为什么要用委托?
为什么不直接调用方法,而是要用委托,不是多此一举吗?其实不然,委托是c#最好的一个特性,它为后来的很多特性都打下了基础。委托使得一个方法可以作为另一个方法的参数进行传递,这就是委托最大的作用。
public class DelegateTest
{
public delegate void GreetingDelegate(string name);
public void Greeting(string name, GreetingDelegate callback)
{
callback(name);
}
public void EnglishGreeting(string name)
{
Console.WriteLine("Hello, " + name);
}
public void ChineseGreeting(string name)
{
Console.WriteLine("你好, " + name);
}
}
static void Main(string[] args)
{
delegateTest.Greeting("路人", delegateTest.ChineseGreeting);
delegateTest.Greeting("luy", delegateTest.EnglishGreeting);
}
这里就把ChineseGreeting和EnglishGreeting方法作为参数传递了。

浙公网安备 33010602011771号