📜  举个使用事件的例子(1)

📅  最后修改于: 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事件被触发时,该方法就会被自动调用,从而向指定邮箱地址发送一封电子邮件。

订阅事件

最后,我们需要实例化LogPublisherEmailNotifier对象,并将后者的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对象便可以自动收到该消息并执行相应的处理。