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();
}