1.定义
委托顾名思义,就是中间人、代理人的意思。通俗地说,委托是一个可以引用方法的对象,即是说委托可以调用它所指向的方法。
2.C#中使用委托的具体的步骤
(1)声明一个委托,其参数形式一定要和想要包含的方法的参数形式一致。
(2)定义所有你要定义的方法,其参数形式和第一步中声明的委托对象的参数形式必须相同。
(3)创建委托对象并将所希望的方法包含在该委托对象中。
(4) 通过委托对象调用包含在其中的各个方法。
步骤1: 声明一个委托
[修饰符]delegate 返回类型 委托名(参数列表);
步骤2:定义方法,其参数形式和步骤1中声明的委托对象的必须相同。
class MyClass1
{
public void dMethod1(string input)
{
Console.WriteLine("Method1传递的参数是 { 0}", input);
}
public void dMethod2(string input)
{
Console.WriteLine("Method2传递的参数是 { 0}", input);
}
}
步骤3:创建一个委托对象并将上面的方法包含其中
MyClass1 c2=new MyClass1();
MyDelegate1 d1 = new MyDelegate1(c2.dMethod1);
//或者直接写成 MyDelegate1 d1 =c2.dMethod1;
步骤4:通过委托对象调用包含在其中的方法。
d1("abc");//Method1传递的参数是 abc
3.多播
委托是可以合并的,又称为多播(Multicast)。合并的委托实际上是对多个方法的调用。对于多个相同类型的委托,可以用加号运算符“+”进行调用列表的合并,可以用减号运算符“-”移除其调用列表中的方法。委托加减运算后的结果,如果其中不包含方法,则结果为null。
MyClass1 c2 = new MyClass1();
MyDelegate1 d1 =c2.dMethod1;
d1 += c2.dMethod2;
d1("abc");
//Method1传递的参数是 abc
//Method2传递的参数是 abc
d1-= c2.dMethod2;
Console.WriteLine(d1)
//ConsoleApp1.MyDelegate1
d1 -= c2.dMethod1;
Console.WriteLine(d1);
//(输出空)
4.如何理解委托
将委托想象成点菜:
顾客去饭店吃饭肯定是不需要自己做菜的,只需要点菜和提需求。真正做菜的是厨师。那么这就存在顾客委托厨师做菜的步骤了。
步骤1: 声明一个委托
(饭店定一个委托机制,顾客根据委托机制进行点菜)
//声明一个点菜的委托(order),点菜时只需要传入基本需求(demand)
//此点菜系统,只允许顾客提一个需求,也就是只能传递一个参数(string demand)
public delegate void order( string demand);
步骤2:定义方法,其参数形式和步骤1中声明的委托对象的必须相同。
(厨师的菜单库,里面炒菜的要求要和饭店的点菜委托机制保持一致。真正做菜的)
//创建厨师类,里面显示厨师会炒的菜
class ChefClsaa//厨师
{
//和点菜系统保持一致,也只接受顾客提一个需求(string input)
public void friedTomato(string input)
{
Console.WriteLine("{0}的炒西红柿", input);
}
public void friedPotato(string input)
{
Console.WriteLine(" {0}的炒土豆", input);
}
}
步骤3:创建一个委托对象并将上面的方法包含其中
(根据点菜的委托机制,顾客开始向厨师点菜)
//customer表示实际需要使用委托的对象,比如正在点菜的你;
//此时你需要在厨师的菜单库中选择只能提一个需求的菜品
ChefClsaa chef= new ChefClsaa();
order customer = chef.friedTomato;//告诉厨师你要吃炒西红柿
步骤4:通过委托对象调用包含在其中的方法。
(根据点菜的委托机制,提出需求,告诉厨师开始做菜)
//现在点好菜了,提出菜品需求,让厨师开始做菜。
customer("少盐");//少盐的炒西红柿
多播的理解
//告诉厨师你还想吃炒土豆
customer += chef.friedPotato;
//告诉厨师你又不想吃西红柿了
customer -= chef.friedTomato;
customer("少盐");// 少盐的炒土豆
点菜的完整代码:
//声明一个点菜的委托(order),点菜时只需要传入基本需求(demand)
//此点菜系统,只允许顾客提一个需求,也就是只能传递一个参数(string demand)
public delegate void order( string demand);
class ChefClsaa//厨师
{
//和点菜系统保持一致,也只接受顾客提一个需求(string input)
public void friedTomato(string input)
{
Console.WriteLine("{0}的炒西红柿", input);
}
public void friedPotato(string input)
{
Console.WriteLine(" {0}的炒土豆", input);
}
}
class Test
{
static void Main(string[] args)
{
ChefClsaa chef= new ChefClsaa();
//customer表示实际需要使用委托的对象,比如正在点菜的你;
//此时你找到了厨师,需要在厨师的菜单库中选择只能提一个需求的菜品
order customer = chef.friedTomato;
//告诉厨师你还想吃炒土豆
customer += chef.friedPotato;
//告诉厨师你又不想吃西红柿了
customer -= chef.friedTomato;
//现在点好菜了,提出菜品需求,让厨师开始做菜。
customer("少盐");
}
}