C# 事件始终为空,因此可以';无法处理
我有3个类,一个类触发事件,另一个类调用事件处理程序发送方,最后一个类接收事件。但是,发送方类中的事件处理程序总是C# 事件始终为空,因此可以';无法处理,c#,class,event-handling,C#,Class,Event Handling,我有3个类,一个类触发事件,另一个类调用事件处理程序发送方,最后一个类接收事件。但是,发送方类中的事件处理程序总是null,因此接收方从不处理事件。我无法理解为什么它是null,因为我将它指定为StartEventHandler,如下所示 我试图输入debug语句,以了解为什么处理程序从未运行过,并发现它从未到达类C 第一类触发事件: Class A { public void Button_Click(object sender, RoutedEventArgs e) {
null
,因此接收方从不处理事件。我无法理解为什么它是null
,因为我将它指定为StartEventHandler
,如下所示
我试图输入debug语句,以了解为什么处理程序从未运行过,并发现它从未到达类C
第一类触发事件:
Class A {
public void Button_Click(object sender, RoutedEventArgs e)
{
B senders = new B();
senders.OnPageSwap(new StartEventArgs());
}
}
第二类是发送者
public delegate void StartEventHandler(object sender, StartEventArgs e);
public class B
{
public event StartEventHandler PageSwap;
public virtual void OnPageSwap(StartEventArgs e)
{
Console.WriteLine("Entered PageSwapSender");
if(PageSwap != null) PageSwap(this, e);
}
}
第三类是接受者
Class C {
B sender = new B();
void Connect()
{
sender.PageSwap += new StartEventHandler(this.sender_PageSwap);
Console.WriteLine("Entered Connect");
}
private void sender_PageSwap(object sender, StartEventArgs e)
{
Console.WriteLine("Entered Handler");
}
}
有谁能告诉我为什么
类B
中的PageSwap
总是null
因此从不运行PageSwap(this,e)
C.Connect()
没有被调用,而且它需要被调用,因为在这里您要注册调用this.sender\u PageSwap
的事件处理程序。没有它,什么也不会发生。代码的问题是,您正在实例化类B
的两个独立实例。在A
中,您试图在B
的一个实例上引发事件。在C
中,您试图使用B
的差异实例来处理引发的事件
通过在C
中创建Connect
方法,您似乎已经尝试了正确的做法,但这正是您应该将B
的现有实例传递到C
的地方
如果您像这样编写代码,它会工作:
class A
{
public void Button_Click(object sender, RoutedEventArgs e)
{
B senders = new B();
C c = new C();
c.Connect(senders);
senders.OnPageSwap(new StartEventArgs());
}
}
public delegate void StartEventHandler(object sender, StartEventArgs e);
public class B
{
public event StartEventHandler PageSwap;
public virtual void OnPageSwap(StartEventArgs e)
{
Console.WriteLine("Entered PageSwapSender");
if (PageSwap != null) PageSwap(this, e);
}
}
class C
{
public void Connect(B sender)
{
sender.PageSwap += new StartEventHandler(this.sender_PageSwap);
Console.WriteLine("Entered Connect");
}
private void sender_PageSwap(object sender, StartEventArgs e)
{
Console.WriteLine("Entered Handler");
}
}
我没有看到对
C.Connect()
的任何调用,因此sender.PageSwap
从未订阅过..?我是否需要调用C.Connect()来启动侦听器,以便等待触发事件?是的,否则C.sender\u PageSwap
将不会注册为sender.PageSwap
的事件处理程序。不过,代码还有其他问题。对于每个C
,C.sender
被初始化为一个新的B
,这意味着Connect()
将订阅一个不同于在a.Button\u单击
中创建的B
,因此单击该按钮仍不会导致调用事件处理程序。。。可能Connect()
应该有一个参数,用于指定将事件处理程序连接到哪个B
。或者,C
应该有一个构造函数参数,用于指定C
应该侦听哪个B
?这还不够,类C创建一个新的B对象,而不是使用在a中创建的对象,因此它将再次不调用