参考博文:http://www.tracefact.net/tech/009.html
委托的基本概念:
1)有了委托你就可以把方法看作像常数一样,而委托就是该常数类型的变量.
从这个角度看来用于声明事件的委托就是声明这个事件触发以后所调用的方法的标签或者特征.只有符合该标签(参数个数和参数类型)的方法才可以做为该用于该事件的回调.
一个事件触发了,你可能需要用多个方法处理该事件或者说该事件调用了多个方法(每个事件的实例都有一个需要调用的方法列表,当事件触发它会逐个调用列表中的每个方法)
2)通过使用委托你可以实现对方法变化的封装.
打个比方:如果你骑自行车,你需要有骑自行车的方法DriveBike().如果你骑摩托车你需要有骑摩托车的方法.现在你有一个方法DriveMoto.现在你需要定义一个方法,实现你骑(自行车或者摩托车)到某地DriveTo(地点,骑的方式)
骑的方式这里其实就是委托.在使用的时候,如果你是骑自行车你就用DriveBike实例化委托的实例带入DriveTo方法,如果你骑摩托车你就用DriveMoto实例化"骑的方式"这个委托带入DriveTo方法.
3)委托本质上就是要用来作为一种多态,通过声明委托,可以实现传递方法,减少代码冗余。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DelegateTest04
{
//声明委托
//该委托表示可以引用任何一个带有一个单一的int参数的方法,并返回一个int类型变量
//调用方传递到委托的参数将传递到该方法,并且委托会将方法的返回值(如果有)返回到调用方,这就称之为调用委托。
public delegate int NumberChanger(int s);
class Program
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
//创建委托示例
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc1(25);
Console.WriteLine("Value of Num:{0}", getNum());
nc2(5);
Console.WriteLine("Value of Num:{0}", getNum());
Console.ReadKey();
}
}
}
三者关系:
委托等于你要强声明一个委托,但是后来觉得委托要是多了声明的委托太多了就弄了个匿名委托【或者说匿名方法】,再后来觉得每次匿名方法还是要写一长串单词干脆上了Lambda再度简化。三者其实本质都一样,或者说当你的代码编译后匿名和lambda编译器其实还是会生成个委托声明的。
参考文献:https://www.cnblogs.com/OrangeZhang/p/delegate_2015112.html
匿名方法:
每次实例化委托的时候都要有一个已经写好的方法,而匿名方法则不需要
class Program
{
//声明带参数的委托
public delegate void MyDelegate(string data);
//委托对象
static MyDelegate myDelegate;
static void Main(string[] args)
{
myDelegate = delegate(string data) //带参数
{
Console.WriteLine(data);
};
myDelegate("带参数的匿名方法");
Console.ReadKey();
}
}
Lambda表达式,lambda表达式的设计内容还需要探讨。
class Program
{
//声明带参数的委托
public delegate void MyDelegate(string data);
//委托对象
static MyDelegate myDelegate;
static void Main(string[] args)
{
myDelegate = (string data) => { Console.WriteLine(data); };
myDelegate("带参数Lambda表达式");
Console.ReadKey();
}
}