繁体   English   中英

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

[英]How can I make consuming custom events on my classes optional?

当我注释掉下面的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;
        }
    }
}
if (OnLoaded != null) {
    OnLoaded(this, new FileManagerArgs("no errors"));
}

在调用委托之前检查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);
    }
}

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

LoadedHandler handler = OnLoaded;

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

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

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

public event LoadedHandler OnLoaded = delegate{};

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM