Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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#_Event Handling - Fatal编程技术网

有没有可能;连锁店;c#中的事件处理程序?

有没有可能;连锁店;c#中的事件处理程序?,c#,event-handling,C#,Event Handling,可以使用如下语法将事件从内部对象实例委托给相应对象的事件处理程序: public class MyControl { public event EventHandler Finish; private Wizard wizard; public MyControl( Wizard wizard ) { this.wizard = wizard; // some other initialization going on here...

可以使用如下语法将事件从内部对象实例委托给相应对象的事件处理程序:

public class MyControl {
   public event EventHandler Finish;

   private Wizard wizard;
   public MyControl( Wizard wizard ) {
      this.wizard = wizard;

      // some other initialization going on here...

      // THIS is what I want to do to chain events
      this.wizard.Finish += Finish;
   } 
}
上述结构的动机是,我有许多类似向导的UI流,并希望将后退、前进和取消处理分离到单个类,以尊重设计中的开放-关闭原则和单一责任原则

在finish中添加一个方法并执行常规检查总是可能的,但是如果有大量嵌套事件,那么最终将得到大量样板代码。

两个选项。第一:

 public event EventHandler Finish
 {
     add { wizard.Finish += value; }
     remove { wizard.Finish -= value; }
 }
第二,正如你提到的:

 public event EventHandler Finish;

 wizard.Finish += WizardFinished;

 private void WizardFinished(object sender, EventArgs e)
 {
     EventHandler handler = Finish;
     if (handler != null)
     {
         handler(this, e);
     }
 }

第二种形式的好处是,事件的来源似乎是中间类,而不是向导-这是合理的,因为处理程序订阅了它。

谢谢,第二种选择背后的推理足以以这种方式实现系统。感谢第一个选项,因为我没有意识到重载add有一个语法。出于好奇,为什么在测试null并调用Finish之前要将Finish分配给handler?@dcrooney:那应该调用handler。将编辑。@Jon:谢谢你的澄清!然而,我仍然缺少将Finish分配给handler所获得的结果;这比直接调用Finish有优势吗?@dcrooney:是的:如果我们直接调用Finish,它可能会失败,并出现NullReferenceException。如果我们只是测试Finish然后调用它,那么该值可能会在测试和调用之间发生变化。