这行代码是什么?

时间:2011-04-03 05:07:00

标签: c# .net c#-3.0 c#-2.0

通常在代码中我会看到一行代码,我知道它会对事件做些什么但不清楚它是做什么的。

我是否有可能在表格B中附上表格A的加载事件,或者它的好处是什么?

this.CGForm .Load +=new EventHandler(CGForm_Load);

4 个答案:

答案 0 :(得分:3)

此行的含义是您将方法CGForm_Load()订阅到this.CGForm.Load事件。方法CGForm_Load()事件处理程序回调

运行此行后,每次引发事件时(在这种情况下 - 每次加载表单时),都会自动调用CGForm_Load()

取消订阅回调,请使用-=,如下所示:

this.CGForm.Load -= new EventHandler(CGForm_Load)

一旦事件回调被取消订阅,下次引发事件时(如果再次加载表单),将不再调用回调。


我发现以下比喻很有用:事件就像电源插座,回调就像电源插头。订阅就像将插头连接到插座,取消订阅就像拉出来一样。当存在连接时,事件的所有调用都会触发回调。

答案 1 :(得分:3)

是的,这显然与事件有关。

在这种情况下,{p> .LoadForm.Load事件。 +=运算符向事件添加一个事件处理程序。事件可以同时具有许多事件处理程序。事件处理程序只是常规方法,可以在代码库中的任何位置。当事件触发时,将一个接一个地调用所有订阅的方法。

我认为没有特别好的理由让FormA听取FormB的Load事件,但其他事件可能更有趣,比如Form.Closed事件。这是让FormA对FormB中的更改做出反应的一种方法。

修改
请注意,这会导致FormA保留对FormB的引用,并且FormA将不会被垃圾收集,直到FormA释放对FormB的引用(具有
this.CGForm .Load -=new EventHandler(CGForm_Load);,请注意-=)这是.NET中内存泄漏的常见原因。

订阅其他表单中的事件是一种“代码味道”,可能是您的代码存在潜在的结构问题。在某些情况下,它是必需的,但是如果你在整个地方都有它,你的代码将难以理解和维护。

答案 2 :(得分:3)

它只是将GCForm_Load方法添加到CGForm上的Load事件中。在加载CGForm时,如下所示的代码将执行。每当发生这种情况时,将调用所有事件订阅者(在这种情况下,此处订阅的方法为CGForm_Load)。

<pseudocode>
class CGForm
{
  public EventHandler<FormLoadedEventArgs> Load;

  private void SomeMethodThatLoadsTheForm()
  {
    LoadForm();
    var loadHandlers = Load;
    if (loadHandlers != null)
    {
       loadHandlers(new FormLoadedEventArgs(...));
    }
  }
}
</pseudocode>

答案 3 :(得分:2)

this.CGForm .Load +=new EventHandler(CGForm_Load);将事件处理程序委托CGForm_Load订阅到Load对象的CGForm事件。

有关订阅活动的文档可在http://msdn.microsoft.com/en-us/library/ms366768(v=vs.80).aspx找到。

有关事件如何在.NET中工作的信息索引可以在http://msdn.microsoft.com/en-US/library/awbftdfh(v=VS.80).aspx

找到