1、定义
委托(delegate)是一种引用类型,我们在处理他的时候要当作类来看待而不是方法,说白了委托就是对方法或者方法列表的引用。
调用一个委托实例就好像是调用c++中的指针一样,他封装了对制定方法的引用,或者说委托起到的是桥梁的作用,实例后的委托对象会将给定的参数传递给他所回调的方法,并去执行方法。
2、委托的声明原型
delegate <函数返回类型> <委托名> (<函数参数>)
public delegate void CheckDelegate(int number);
委托在.net内相当于声明了一个类,类如果不实例化为对象,很多功能是没有办法使用的,委托也是如此。
3、委托实例化的原型
<委托类型> <实例化名>=new <委托类型>(<注册函数>)
CheckDelegate checkDelegate=new CheckDelegate(CheckMod);
4、创建步骤
(1)声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。
(2)创建delegate对象,并"将你想要传递的函数作为参数传入"。
(3)通过上一步创建的对象来调用方法。
案例一
// 步骤1,声明delegate对象
public delegate void BuyTicketDelegate();
class Test
{
public static void BuyTicket()
{
Console.WriteLine("每次都让我去买票,鸟人呀!");
}
static void Main(string[] args)
{
// 步骤2,创建Get对象
BuyTicketDelegate get = new BuyTicketDelegate(Test.BuyTicket)
// 步骤3,调用get
get();
}
}
案例二
public delegate void DelegateUtil(string sName);
class DelegateUtilClass
{
static void Main(string[] args)
{
Console.WriteLine("输出结果是:");
DelegateUtil du = new DelegateUtil(DelegateUtilClass.OutPut);
du("I'm learning delegate now !");
}
//这是想要传递的方法,该方法与定义的委托(即DelegateUtil)具有相同的参数和返回值类型,函数名是不一样!
public static void OutPut(string sName)
{
Console.WriteLine("Hi, " + sName);
}
}
可以直接用匹配的函数实例化委托:
<委托类型> <实例化名>=<注册函数>
DelegateUtil du = OutPut(I'm learning delegate now !);
5、多播委托
如果委托包含了多个方法的调用,这种委托就被称为多播委托。当使用多播委托时,就可以按顺序连续调用多个方法。
委托可以用运算符“+”串在一起,也可以用运算符“-”从多播委托中删除。
案例三
delegate void MyDelegate(int a, int b);
class MyTest{
static void Add(int a, int b) {
Console.WriteLine(a + b);
}
static void Sub(int a, int b)
{
Console.WriteLine(a - b);
}
static void Main(string[] args)
{
MyDelegate md;
MyDelegate md1 = new MyDelegate(Add);
MyDelegate md2 = new MyDelegate(Sub);
md = md1 + md2;
//md = md1 - md2;
md(1,2);
}
}
6、Action<T> 委托
案例四
class Test
{
public static void BuyTicket()
{
Console.WriteLine("每次都让我去买票,鸟人呀!");
}
static void Main(string[] args)
{
Action act = BuyTicket;
act();
}
}
案例五
class Test
{
public static void BuyTicket(string s)
{
Console.WriteLine(s);
}
static void Main(string[] args)
{
Action<string> act = BuyTicket;
act("每次都让我去买票,鸟人呀!");
}
}
7、Func<T>委托
它和Action<T>的区别就是没有返回值
public static string HelloEnglish(string strEnglish)
{
return "Hello." + strEnglish;
}
Func<string, string> f = HelloEnglish;
Console.WriteLine(f("English"));