如何在我的类上自定义消费自定义事件?

时间:2010-02-09 15:12:59

标签: c# events event-handling

当我注释掉下面的fm.OnLoaded行时,它会给我一个错误,即OnLoaded为空。

如何让我的类的调用者可选择使用或不使用.NET类/事件?

using System;
using System.Windows;

namespace TestEventLoaded8282
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            FileManager fm = new FileManager();
            //fm.OnLoaded += new FileManager.LoadedHandler(fm_OnLoaded);
            fm.Load();
        }

        void fm_OnLoaded(object obj, FileManagerArgs args)
        {
            Console.WriteLine("the file manager is loaded: " + args.Message); 
        }
    }

    public class FileManager
    {
        public string Name { get; set; }

        public delegate void LoadedHandler(object obj, FileManagerArgs args);
        public event LoadedHandler OnLoaded;

        public FileManager()
        {}

        public void Load()
        {
            Name = "this is the test file manager";
            OnLoaded(this, new FileManagerArgs("no errors"));
        }
    }

    public class FileManagerArgs : EventArgs
    {
        public string Message { get; set; }

        public FileManagerArgs(string message)
        {
            Message = message;
        }
    }
}

3 个答案:

答案 0 :(得分:5)

if (OnLoaded != null) {
    OnLoaded(this, new FileManagerArgs("no errors"));
}

答案 1 :(得分:3)

在调用委托之前检查null。以下是一种常见模式:

public event EventHandler<FileManagerEventArgs> Loaded;

public void Load()
{
    ...
    OnLoaded(new FileManagerEventArgs("no errors"));
}

protected virtual void OnLoaded(FileManagerEventArgs e)
{
    EventHandler<FileManagerEventArgs> handler = this.Loaded;
    if (handler != null)
    {
        handler(this, e);
    }
}

答案 2 :(得分:3)

在调用之前,您需要检查OnLoaded事件处理程序是否为null

LoadedHandler handler = OnLoaded;

if (handler != null)
{
    handler(this, new FileManagerArgs("no errors"));
}

每次调用事件处理程序时都需要这样做。上面的本地handler变量用于捕获可以检查处理程序是否为空的情况,但在调用之前会删除处理程序。创建局部变量会捕获处理程序以防止这种情况发生。

另一种方法是将事件处理程序定义为:

public event LoadedHandler OnLoaded = delegate{};

这声明了一个默认的空事件处理程序,使得null检查变得多余(尽管使用这种方法会有轻微的性能损失)。