在什么情况下此事件将为空?

时间:2015-01-27 22:40:53

标签: c# events mvp

我正在使用MVP模式构建应用程序。为了在演示者中发生事情,我在视图中创建事件,演示者将观察它们。 ReSharper给我一个关于可能的空引用异常的警告,我看到在触发事件之前检查null的教程。事件究竟能以何种方式为空?以下是我的代码示例:

public partial class PrinterSelectView : Form, IPrinterSelectView
{
    public PrinterSelectView()
    {
        InitializeComponent();
    }

    public event Action Canceled;
    public event Action Saved;

    private void btnCancelClick(object sender, EventArgs e)
    {
        if(Canceled != null)
        {
            Canceled();
        }
    }

}

2 个答案:

答案 0 :(得分:5)

如果没有代码注册事件(调用Canceled += <some code>),则事件将为null。检查确保在触发事件之前有任何已注册的听众。

答案 1 :(得分:1)

默认情况下,它们始终为null。此对象的调用者可以稍后订阅事件,例如:

var view = new PrinterSelectView();
view.Canceled += OnCanceled; // now it's not null

但之前,或者如果来电者从未订阅过你的活动,那么它将为空。

防止此类警告的一种通用方法是始终自行为其分配一个空委托,例如:

public partial class PrinterSelectView : Form, IPrinterSelectView
{
    public event Action Canceled = () => { }; // will never be null now
    public event Action Saved = () => { };
    // ...
}

这只是为两个事件分配一个空的lambda表达式,这允许你只假设事件永远不会为null。