一、委托事件
namespace CSharpAdvanceEvent
{
/// <summary>
/// 委托一个事件:什么叫事件?事件就是委托的安全版本。
/// 1---在定义事件类的外部,他是不能使用=号来操作的,只能用+=。
/// 2---在定义事件类的外部不能调用事件。
/// 3---事件就是在委托前面增加一个event关键字。
/// </summary>
delegate void StudentDelegate();
class Program
{
static void Main(string[] args)
{
EventFunction eventFunction = new EventFunction();
InvokeDefine invokeDefine = new InvokeDefine();
invokeDefine.StudentEvent += eventFunction.Student1;
invokeDefine.StudentEvent += eventFunction.Student2;
invokeDefine.Invoke();
Console.ReadKey();
}
}
class InvokeDefine
{
public event StudentDelegate StudentEvent; //一定要写在类的内部
public void Invoke()
{
StudentEvent?.Invoke(); //?.Null检查运算符,不为Null执行
}
}
class EventFunction
{
public void Student1()
{
Console.WriteLine("我是Ant编程1号学员");
}
public void Student2()
{
Console.WriteLine("我是Ant编程2号学员");
}
}
}
二、Winform事件
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/*
public event EventHandler Click;
public delegate void EventHandler(object sender, EventArgs e);
private System.Windows.Forms.Button button1;对象里定义并且调用了事件
//EventArgs事件参数的基类
*/
private void button1_Click(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
三、自定义事件
namespace StudenttEvent
{
class Program
{
static void Main(string[] args)
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber("subscriber",publisher);
Subscriber2 subscriber2 = new Subscriber2("subscriber2", publisher);
//调用引发事件的方法
publisher.DoSomething();
Console.ReadKey();
}
}
//事件参数
class CustomEventArgs:EventArgs
{
public CustomEventArgs(string message)
{
Message = message;
}
public string Message { get; set; }
}
//事件发布者: 事件的定义和调用,触发事件也可以写在这里面
class Publisher
{
public event EventHandler<CustomEventArgs> CustomEvent;
public void DoSomething()
{
//调用之前可以在这里写一些其他东西
OnCustomEvent(new CustomEventArgs("我是事件参数"));
}
//在受保护的虚方法中包装事件的调用,这样就允许派生类重写调用行为
protected virtual void OnCustomEvent(CustomEventArgs e)
{
CustomEvent?.Invoke(this, e);
}
}
//事件订阅者:事件方法编写和订阅
class Subscriber
{
//订阅的动作要在这里面了,所以才要传过来发布者
public Subscriber(string str,Publisher publisher)
{
Str = str;
//订阅事件
publisher.CustomEvent += HanderCustomEvent;
}
private readonly string Str;
private void HanderCustomEvent(object sender,CustomEventArgs e)
{
//在这里做想做的事件
Console.WriteLine($"发布者:{sender.GetType()},订阅者:{Str} ,参数是: {e.Message}");
}
}
//事件订阅者:事件方法编写和订阅
class Subscriber2
{
//订阅的动作要在这里面了,所以才要传过来发布者
public Subscriber2(string str, Publisher publisher)
{
Str = str;
//订阅事件
publisher.CustomEvent += HanderCustomEvent;
}
private readonly string Str;
private void HanderCustomEvent(object sender, CustomEventArgs e)
{
//在这里做想做的事件
Console.WriteLine($"发布者:{sender.GetType()},订阅者:{Str} ,参数是: {e.Message}");
}
}
}