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

C# 在什么情况下,此事件将为空?,c#,events,mvp,C#,Events,Mvp,我正在使用MVP模式构建一个应用程序。为了让事情在演示者中发生,我正在视图中创建事件,演示者将监视它们。ReSharper向我发出了关于可能的null引用异常的警告,我看到了一些教程,这些教程在触发事件之前检查null。事件以何种方式可以为空?下面是我的代码示例: public partial class PrinterSelectView : Form, IPrinterSelectView { public PrinterSelectView() { Init

我正在使用MVP模式构建一个应用程序。为了让事情在演示者中发生,我正在视图中创建事件,演示者将监视它们。ReSharper向我发出了关于可能的null引用异常的警告,我看到了一些教程,这些教程在触发事件之前检查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();
        }
    }

}

如果没有为事件注册代码(调用
取消+=
),则事件将为空。该检查确保在触发事件之前存在任何已注册的侦听器。

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

var view = new PrinterSelectView();
view.Canceled += OnCanceled; // now it's not null
但是在此之前,或者如果调用方从未订阅,那么您的事件将为null

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

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

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

因此,使该事件有效的不是视图本身,而是演示者将事件绑定到要使用的方法。感谢您的澄清。这是一个很好的解决方法,但在我的情况下,我想我更喜欢在事件失败时捕获并记录一个事件,因为没有人在听。我想知道为什么有人认为我问的问题不清楚。