Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 事件始终为空,因此可以';无法处理_C#_Class_Event Handling - Fatal编程技术网

C# 事件始终为空,因此可以';无法处理

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) {

我有3个类,一个类触发事件,另一个类调用事件处理程序发送方,最后一个类接收事件。但是,发送方类中的事件处理程序总是
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中创建的对象,因此它将再次不调用