我正在使用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();
}
}
}
答案 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。