📅  最后修改于: 2023-12-03 15:36:01.940000             🧑  作者: Mango
事件是.NET框架中一种非常强大的编程模式,它可以让程序员在对象发生特定动作时,自动触发预先定义好的方法。以下是一个使用事件的例子。
首先,我们需要定义一个事件发布者。在本例中,我们假设我们正在编写一个简单的日志记录系统,需要在记录日志消息时触发事件,以便其他对象可以响应并进行相应的处理。
public class LogPublisher
{
public event EventHandler<LogEventArgs> LogRecorded;
public void RecordLog(string message)
{
// 记录日志逻辑
OnLogRecorded(new LogEventArgs(message));
}
protected virtual void OnLogRecorded(LogEventArgs e)
{
LogRecorded?.Invoke(this, e);
}
}
public class LogEventArgs : EventArgs
{
public string Message { get; }
public LogEventArgs(string message)
{
Message = message;
}
}
以上代码中,我们定义了一个LogPublisher
类,其中包含一个名为LogRecorded
的事件。该事件的处理程序需要一个LogEventArgs
对象作为参数,其中包含了要记录的日志消息。在RecordLog
方法中,我们记录了日志消息,然后调用OnLogRecorded
方法触发事件。
接下来,我们需要定义一个事件订阅者,以便响应LogRecorded
事件。在本例中,我们假设我们正在编写一个简单的邮件通知系统,需要在收到日志消息时向特定的邮箱地址发送电子邮件。
public class EmailNotifier
{
private readonly string _emailAddress;
public EmailNotifier(string emailAddress)
{
_emailAddress = emailAddress;
}
public void OnLogRecorded(object sender, LogEventArgs e)
{
// 发送邮件逻辑
Console.WriteLine($"Email sent to {_emailAddress} with message '{e.Message}'");
}
}
以上代码中,我们定义了一个EmailNotifier
类,其中包含了一个OnLogRecorded
方法作为事件处理程序。每当LogRecorded
事件被触发时,该方法就会被自动调用,从而向指定邮箱地址发送一封电子邮件。
最后,我们需要实例化LogPublisher
和EmailNotifier
对象,并将后者的OnLogRecorded
方法订阅到前者的LogRecorded
事件上,以便在记录日志消息时触发邮件通知。
var logPublisher = new LogPublisher();
var emailNotifier = new EmailNotifier("example@example.com");
logPublisher.LogRecorded += emailNotifier.OnLogRecorded;
logPublisher.RecordLog("Error: disk space is running low");
当我们执行以上代码片段时,将会输出以下信息:
Email sent to example@example.com with message 'Error: disk space is running low'
这表明LogRecorded
事件被成功触发,并且EmailNotifier
对象成功订阅了该事件。由于LogPublisher
对象自动调用了OnLogRecorded
方法并将LogEventArgs
对象作为参数传递给了该方法,因此EmailNotifier
对象便可以自动收到该消息并执行相应的处理。