委托
个人理解:是一个执行方法的类(这些方法返回值和参数列表一样)。
格式:使用delegate关键字。
注意:调用有返回值的方法,委托调用返回的值只是最后一个方法的值。
public delegate void MyDel(int a,int b);
class Program
{
public void Add(int a,int b)
{
Console.WriteLine(a+b);
}
public void Sub(int a,int b)
{
Console.WriteLine(a-b);
}
public void Div(int a,int b)
{
Console.writeLine(a*1.0/b);
}
static void Main()
{
Program p=new Program();
MyDel del;//创建委托
del=p.Add;//给委托添加方法
del+=p.Sub;
del+=p.Div;
del(3,2);//执行委托
}
}
class Program
{
public void Add(int a,int b)
{
Console.WriteLine(a+b);
}
public void Sub(int a,int b)
{
Console.WriteLine(a-b);
}
public void Div(int a,int b)
{
Console.writeLine(a*1.0/b);
}
static void Main()
{
Program p=new Program();
MyDel del;//创建委托
del=p.Add;//给委托添加方法
del+=p.Sub;
del+=p.Div;
del(3,2);//执行委托
}
}
事件
事件是一种特殊的委托。简单来说就是当收到某些行为触发的一系列行动称为事件,如老鼠看见猫被吓得逃跑,那么逃跑就是一个事件。
组成包括声明事件,订阅事件,发布事件。
delegate void Handler();//声明委托
class Wang
{
public event Handler Marriage;//创建事件并发布
public void DoEvent()
{
Console.WriteLine("我要结婚啦!");
if(Marriage!=null)//判断事件是否为空
Marriage();
}
class First
{
public void BlessingFirst()
{
Console.WriteLine("小王恭喜啊!早生贵子哦!");
}
}
class Second
{
public void BlessingSecond()
{
Console.WriteLine("百年好合!");
}
}
class Program
{
static void Main()
{
Wang w=new Wang();
First f=new First();
Second s=new Second();
/*订阅事件*/
w.Marriage+=f.BlessingFirst;
w.Marriage+=s.BlessingSecond;
s.DoEvent();
}
}
代码示例2:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
delegate void Hander(string name);//声明委托
class Baoshe
{
public event Hander Subscribe;//创建事件并发布
public void Newspaper(string name)
{
if (name == "中国青年报" || name == "古今武侠传奇")
Subscribe(name);
else
Console.WriteLine("本报社没有发布"+"《"+name+"》"+"期刊");
}
}
class People
{
public string Name { get; set; }
public People(string name)
{
this.Name = name;
}
public void Receive(string mazName)
{
Console.WriteLine(Name+"说我接到一本"+mazName);
}
}
class Program
{
static void Main(string[] args)
{
People m = new People("小明");
People h = new People("小红");
People g= new People("小刚");
People z = new People("小张");
/*订阅事件*/
Baoshe wu =new Baoshe();
wu.Subscribe += m.Receive;
wu.Subscribe += z.Receive;
wu.Subscribe += g.Receive;
wu.Newspaper("古今武侠传奇");
Baoshe qi = new Baoshe();
qi.Subscribe += h.Receive;
qi.Subscribe += g.Receive;
qi.Newspaper("中国青年报");
Console.ReadKey();
}
}
}
注意:事件只有+=,委托的第一个方法是=。