来源:C#委托(Delegate),事件(Event)_菜鸟中的愤怒的小鸟-CSDN博客
C#还有两个内置委托,Action和Func;
Action:无返回值,0~16个参数
Action<int【参数类型】,……> act
Func:一个返回值,0~16个参数
Func<int【参数类型】,……,bool【最后一个是返回值类型】】> func
例子看:C#内置委托Action,Func_菜鸟中的愤怒的小鸟-CSDN博客
附:测试源码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate
{
//Delegate委托是一种特殊的类,它的功能相当于保存方法的指针,将委托类实例化即可实现方法参数化,进而用于事件和回调方法等。
//Event事件可以被看作一个委托类型的变量,通过委托的多播实现事件派发。
//public delegate 【返回类型】 DoActionDelegate(【参数】);
//实例化:
//
// DoActionDelegate doAct = DoActionDelegate(【方法名】)
//
// 执行目标方法
//
// doAct(【参数】)
//
#region Delegate简单使用
//public delegate void DoActionDelegate();
//class Dog
//{
// private Dictionary<string, DoActionDelegate> dic = new Dictionary<string, DoActionDelegate>();
// public void Cry()
// {
// Console.WriteLine("吠");
// }
// public void Action()
// {
// Console.WriteLine("咬");
// }
// public void initAct()
// {
// dic.Add("cry", new DoActionDelegate(Cry));
// dic.Add("action", new DoActionDelegate(Action));
// }
// public void PlayAct(String _name)
// {
// // DoActionDelegate act = new DoActionDelegate(Action);
// // act();
// dic[_name]();
// }
//}
#endregion
#region 对象间通讯,实现对象之间发布和接收事件
class Sender
{
public delegate void EventDelegate(string str);
public event EventDelegate Eventdel;
public void SendEvent()
{
Eventdel("test");
}
}
class Recevier
{
public void ReceiveEvent(string str)
{
Console.WriteLine(str);
}
}
#endregion
//public delegate string DoTalkDelegate(string str);
public delegate void EventDelegate(string str);
class Program
{
#region 方法间的通讯
//Event和多播Delegate
public EventDelegate EventDelegate;
static void ReceiverA(string str)
{
Console.WriteLine(str);
}
static void ReceiverB(string str)
{
Console.WriteLine(str);
}
void Send()
{
EventDelegate += new EventDelegate(ReceiverA);
EventDelegate += new EventDelegate(ReceiverB);
EventDelegate("AA");
}
#endregion
static void Main(string[] args)
{
//Dog dog = new Dog();
//dog.initAct();
//dog.PlayAct("cry");
//匿名方法:
// 没有名字的方法,通过delegate关键字创建后直接赋值给委托变量。
//
// 不需要指定返回值,编译器会通过return的类型直接判断。
//用Lambda表达式简写匿名方法(其实就是把delegate换成 =>)
//DoTalkDelegate actFunDelegate = delegate(string str) { return "狗在:" + str; };
//DoTalkDelegate actFunDelegate = (string str) => { return "狗在:" + str; };
//Console.WriteLine(actFunDelegate("吠"));
//Event和多播Delegate:
//多播说白了,你把实例好的委托看成是一个队列或集合,+= 看成是执行Add方法,
//-= 看成是执行Remove方法,但如果你直接用 = 号那就相当于把这个方法直接赋值给了委托对象,
//会造成前面的添加进委托对象的方法被覆盖。
//Program program = new Program();
//program.send();
Recevier recevier = new Recevier();
Sender sender = new Sender();
sender.Eventdel += new Sender.EventDelegate(recevier.ReceiveEvent);
sender.SendEvent();
Console.ReadKey();
}
}
}