1.委托,为了方便理解,可以将委托当作C/C++中的函数指针,可以将方法当作参数传参。
using System;
delegate int DelegateEventHandler(int i);
namespace DelegateTest
{
class A
{
public static int Fun(int i)
{
return i*i*i;
}
}
class B
{
public int Add(int i)
{
return i+i;
}
public int Mul(int i)
{
return i*i;
}
static void Main(string[] args)
{
// 创建委托实例
DelegateEventHandler a = new NumberChanger(Add);
DelegateEventHandler b = new NumberChanger(Mul);
DelegateEventHandler c = new NumberChanger(A.Fun);
// 实例调用方法
a(25);
b(25);
c(25);
Console.WriteLine("Value of Num: {0}", a(25));
Console.WriteLine("Value of Num: {0}", b(25));
Console.WriteLine("Value of Num: {0}", c(25));
Console.ReadKey();
//委托链及创建委托的简写
DelegateEventHandler d = Add;//效果跟上面创建方式相同
d+=Mul;
d+=A.Fun;
}
}
}
可以理解为,有一个公司叫DelegateEventHandler,接受别人委托,这个委托必须是跟公司业务相关(有返回值跟传参类型要一样 本例中返回值跟传参都为int型)。
DelegateEventHandler这个公司接受委托后派工人帮忙解决问题(实例化对象 a b c)。之后客户需要解决这个委托时,直接找该公司派出的人就可以了(调用实例化对象 a b c)。委托链实现了一个工人能解决很多问题。
2.事件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestDemo
{
public delegate void KillEventHandler(string name);//委托
public delegate void KillAllEventHandler(); //委托
public class Program
{
static void Main(string[] args)
{
people e = new people();
worker Li1 = new worker(e);//
friends Li2 = new friends(e);
e.INeedFood("肉");
e.INeedWater();
Console.ReadKey();
}
}
/*****************************事件发布器*************************************/
public class people
{
public event KillEventHandler eat; //事件
public event KillAllEventHandler drink; //事件
public void INeedFood(string food)
{
Console.WriteLine("我想吃{0}!", food);
if (eat != null)
{
eat(food); //当事件发布器这个类的实例调用此方法的时候触发相应的事件。
}
}
public void INeedWater()
{
Console.WriteLine("给我喝的!");
if (drink != null)
{
drink(); //当事件发布器这个类的实例调用此方法的时候触发相应的事件。
}
}
}
/*****************************事件订阅器1***************************************/
public class worker
{
public people Li { get; set; }
public worker(people li)
{
this.Li = li;
Li.eat += eat;
Li.drink += drink;
}
public void eat(string name)
{
Console.WriteLine("1:给他{0}吃了", name);
}
public void drink()
{
Console.WriteLine("1:给他橙汁喝");
}
}
public class friends
{
public people Li { get; set; }
public friends(people li)
{
this.Li = li;
Li.eat += eat;
Li.drink += drink;
}
public void eat(string name)
{
Console.WriteLine("2:我有{0},但是就不给你吃", name);
}
public void drink()
{
Console.WriteLine("2:我有白开水跟啤酒你选那一个");
}
}
}
事件一个特殊的委托,只不过这个委托交给了很多人,每个人对于这个委托都有自己独特的处理方式,当事件触发的时候,订阅器接收信号之后,按照自己的方式来解决问题。