C# 与事件的接口

C# 与事件的接口,c#,events,interface,nullpointerexception,C#,Events,Interface,Nullpointerexception,我只需要提出一个自定义事件,我想实现它 以下是界面: public delegate void Back(); interface IGoBack { event Back GoBack; void ExecuteGoBack(); } 以下是一个工作实现: public partial class LiveView : UserControl, IGoBack { public LiveView() { InitializeComponent

我只需要提出一个自定义事件,我想实现它

以下是界面:

public delegate void Back();

interface IGoBack
{
    event Back GoBack;
    void ExecuteGoBack();
}
以下是一个工作实现:

public partial class LiveView : UserControl, IGoBack
{
    public LiveView()
    {
        InitializeComponent();
    }

    public event Back GoBack;
    public void ExecuteGoBack()
    {
        GoBack();
    }

    private void btnGoBack_Click(object sender, EventArgs e)
    {
        ExecuteGoBack();
    }
}
这不起作用(事件上出现空指针异常):


你认为我做错了什么?

引发事件通常是这样实现的:

public void RaiseGoBack()
{
    var handler = GoBack;
    if(handler == null)
        return;
    handler();
}
此实现的原因是线程安全。在您的代码中,可能有人在
if
之后但在您实际调用它之前分离了最后一个处理程序。在这种情况下,
GoBack
将是
null
,尽管您进行了检查。
上面的实现通过获取当前连接的处理程序的“快照”并在此快照上执行检查和调用来解决此问题

话虽如此,您需要附加一个调试器或检查堆栈跟踪,以验证
NullReferenceException
的确切位置。我上面概述的问题是所谓的竞争条件。如果不大量使用多个线程,通常不会发生这种情况。

这意味着您的异常最有可能是在其他地方引起的,最有可能是在某个事件处理程序中。

尝试使用
public event Back GoBack=delegate{}声明您的事件可能您有一个引发nullreferenceexception的事件处理程序。它不在代码中。(或者删除检查和事件调用之间的引用)@KonstantinVasilcov I get“接口中的事件不能有初始值设定项”message@user1290141你把它放在界面上了吗?您应该在实现中使用它,即在
ViolationsControl
或/和
LiveView
@fix\u likes\u编码中使用。谢谢,如果可以,我也会将此标记为答案。是的,但如果它始终为空怎么办?(我的情况就是这样)@user1290141:什么总是
null
?var handler=GoBack;//戈巴克==null@user1290141:显然,没有人将处理程序附加到事件。我只是不明白为什么LiveView控件可以工作,而另一个不能。
public void RaiseGoBack()
{
    var handler = GoBack;
    if(handler == null)
        return;
    handler();
}