事件采用发布/订阅模型,其中发布者决定在什么情况引发事件,而订阅者决定为响应事件而执行的操作。事件可以有多个订阅者,此时,将在事件被触发是同步调用事件处理程序。如果事件没有订阅者,将不会引发。订阅者可处理来自多个发布者的多个事件。
事件是一种回调,可以将方法作为参数传递给另一个参数,在C#中,这种回调被称为委托。事件处理程序不过是通过委托调用的方法,这类似于C/C++中函数指针。委托类型定义了一个方法签名,可将任何具有兼容签名的方法与委托向关联。
废话不多说直接上代码
/// <summary>
/// 自定义事件委托,将 数据(此处只有data) 传递给订阅者
/// 定义此类,纯粹是为了传递数据
/// </summary>
public class CustomerEventArgs : System.EventArgs
{
private readonly string _data;
public string Data { get { return _data; } }
public CustomerEventArgs(string str)
{
this._data = str;
}
}
// 事件的发布者Contact
public class Contact
{
//两个都是发布事件
public event EventHandler<CustomerEventArgs> DataChanged;
//public event EventHandler DataChangedAgain; //此事件就是没有使用自定义数据
// 定义事件引发方法
protected virtual void OnDataChanged(CustomerEventArgs e)
{
EventHandler<CustomerEventArgs> hander = DataChanged;
if (hander != null)
{
hander(this, e);
}
// 简化调用,与上面的作用一样
// DataChanged?.Invoke(this, e);
}
public string Data
{
set
{
CustomerEventArgs arg = new CustomerEventArgs(value);
this.OnDataChanged(arg);
}
}
public override string ToString()
{
return "This is Contact,the data has changed to : ";
}
}
public class EventTest
{
/// <summary>
/// 订阅者
/// </summary>
/// <param name="sender">事件引发者</param>
/// <param name="e">自定义传递参数</param>
public void DoSomething(Object sender, CustomerEventArgs e)
{
Console.WriteLine(sender.ToString() + e.Data);
}
public void Test()
{
var contact = new Contact();
contact.DataChanged += DoSomething; //订阅事件
var words = Console.ReadLine();
contact.Data = words;
}
}
还是,稍微说一下使用的步骤吧,方便以后理解。
首先,事件使用的委托是: EventHandler
使用事件的步骤:
1、确定是否需要自定义数据,需要则从System.EventArgs派生新类
2、创建事件发布者类Contact,并发布事件:public event EventHandler DataChanged
3、在发布者类定义引发事件
4、创建订阅者(定义响应函数)
5、订阅事件 contact.DataChanged += DoSomething;
6、触发事件
附上结果图一张:
另外,可以在DoSomething方法内打个断点,看是否有进入这响应函数。