委托有点像C语言里的函数指针,如果代码想要执行操作,但不知道操作细节,一般可以使用委托。
事件是建立在委托之上的一层封装。
事件和委托的区别就是 访问限制的区别 event就是访问受限的delegate,不能类外去invoke它
Func<1,2,3> 尖括号里的东西最后一个参数3是返回值,Action没有返回值,其实就是系统为了方便用户定义的两个默认委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub1 = new Subscriber("sub1", pub);
Subscriber sub2 = new Subscriber("sub2", pub);
pub.DoSomething();
Console.ReadLine();
}
}
// 定义一个类来保存自定义事件信息
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
message = s;
}
private string message;
public string Message
{
get { return message; }
set { message = value; }
}
}
class Publisher {
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
public void DoSomething() {
// 唤起事件
OnRaiseCustomEvent(new CustomEventArgs("Did something"));
}
protected virtual void OnRaiseCustomEvent(CustomEventArgs e) {
EventHandler<CustomEventArgs> handler = RaiseCustomEvent;
if (handler != null) {
e.Message += String.Format(" at {0}",DateTime.Now.ToString());
// 使用 () 唤醒事件
handler(this, e);
}
}
}
class Subscriber {
private string id;
public Subscriber(string ID, Publisher pub) {
id = ID;
pub.RaiseCustomEvent += HandleCustomEvent;
}
// 定义事件唤醒所触发的动作
void HandleCustomEvent(Object sender, CustomEventArgs e) {
Console.WriteLine(id + " received this message: {0}", e.Message);
}
}
}
这里事件就用到了委托 EventHandler省去了 delegate