当我注释掉下面的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;
}
}
}
答案 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检查变得多余(尽管使用这种方法会有轻微的性能损失)。