整个过程:在事件所有者,即被观察者中定义事件,(方法集合)以及触发方法,触发即可
过程中需要订阅观察者方法,传给他被观察者对象和相关事件参数,
知识点:标准事件void返回,两个参数返回,
官方说法:https://docs.microsoft.com/zh-cn/dotnet/csharp/event-pattern
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EventStandardModel
{
/*
* 官方说的非常清楚,标准事件的委托签名就是长这样,
* 非常明显它需要一个EventArgs类型,我们可以自定义一个
void OnEventRaised(object sender, EventArgs args);
*/
class Program
{
static void Main(string[] args)
{
TestEvent test = new TestEvent();
// 订阅事件,注册一个方法,
test.MyEventEventHandler += AnyMethod;
// 调用触发方法,可它是受保护的方法,到底如何触发呢?
//这里不是直接调用,而是借助另一个触发点,比如计算完一个数,触发,或是价格属性,改变进行
//或是搜索文件时触发,宏观的感觉,就是自身动作,将自身一些数据,作为参数传递过去,触发其他对象的行为
//触发事件
test.DoneAfterCalculate();
}
//这里想起来按钮点击事件,也是长这个样子,发送者即按钮
static void AnyMethod(object sender, MyEventArgs e)
{
Console.WriteLine("计算结果:"+e.MyProperty+"(触发注册的方法,这个方法可以是静态方法,可以是别的对象方法,总之当事件所有者对象,触发,这里注册的方法的触发)");
}
}
//这个参数类型,有自己的属性,方便传递
public class MyEventArgs : EventArgs {
public int MyProperty { get; set; }
public MyEventArgs(int param) {
MyProperty = param;
}
}
//事件是属于哪个对象,
public class TestEvent {
//!!!!!!!!!!!这里定义标准事件,官方给予另外一种
//定义一个标准事件,就像定义一般的事件一样,先定义委托,
//必须无返回值,且拥有两个参数
//*********第一种:自定义委托,和事件签名
public delegate void MyEventHandler(object sender,MyEventArgs eventArgs);
//事件本质仍然是来自多播委托,加上event关键修饰,让它有专属特点,即所有者进行添加移除操作,
public event MyEventHandler MyEventEventHandler;
//已经定义一个事件,其实这里相当于定义一个方法集合,
//*********第二种:自定义委托,和事件签名,一模一样的效果
//public event EventHandler<MyEventArgs> MyEventEventHandler;
//写一个触发事件,即调用方法集合,要求受保护的虚方法,这个方法必须以On为前缀,加上事件名(PriceChanged),还要接受一个EventArgs参数,
//即调用这个集合,一些列特定方法,需要的参数
protected virtual void OnMyEventEventHandler(MyEventArgs args) {
//事件(方法集合)不为空,那么调用即可
if (MyEventEventHandler!=null)
{
//需要两个参数,一个正好是调用者本身,另外传递一个参数
MyEventEventHandler(this,args);
}
}
public void DoneAfterCalculate() {
int result = 0;
for (int i = 0; i < 1000; i++)
{
result += i;
}
//计算完,触发一下
OnMyEventEventHandler(new MyEventArgs(result));
}
}
}
网上有说法是:
委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针。或委托可以看成一种表示函数的数据类型,类似函数指针.
而事件是特殊的委托,
博主个人理解,将委托视为特定方法集合,更好理解,