实际的事件处理代码在哪里?

时间:2013-03-04 23:50:17

标签: c# delegates event-handling compact-framework windows-ce

我已经全力以赴,试图弄明白这段代码实际上应该完成。

在某些情况下,使用bool arg为true调用以下内容(如此处所示),其他时间为false:

InitializeBackgroundThread_PDALoginTerminate(true);

InitializeBackgroundThread_PDALoginTerminate()方法连接或断开事件处理程序,似乎:

private void InitializeBackgroundThread_PDALoginTerminate( bool add )
{
    try
    {
        if ( add ) 
            pc.PDALoginTerminate += new PendingCommands.PDALoginTerminateEventHandler( DeinitLoginDialogs );
        else
            pc.PDALoginTerminate -= new PendingCommands.PDALoginTerminateEventHandler( DeinitLoginDialogs );

。 。

...这是PendingCommands.PDALoginTerminateEventHandler()指向的代码:

public   delegate  void  PDALoginTerminateEventHandler();
public   event           PDALoginTerminateEventHandler PDALoginTerminate;
public   void          OnPDALoginTerminate()
{
    if (PDALoginTerminate != null)
        PDALoginTerminate();
}

我不知道这里发生了什么,如果有什么事情真的发生的话;似乎代码只是追逐自己的尾巴或是一个大的野鹅追逐/循环引用;右键单击PDALoginTerminate()将我带到它上面的行。

我错过了什么(此外,希望暂时,我的理智还是很好)?

注意:这是一个.NET 1.1项目。

更新

我喜欢简化的想法,但如果我这样做:

pc.PDALoginTerminate += DeinitLoginDialogs;

...我明白了,“方法'PDAClient.frmCentral.DeinitLoginDialogs()'没有括号引用

......如果我这样做:

pc.PDALoginTerminate += DeinitLoginDialogs();

我知道,“无法将类型'void'隐式转换为'PendingCommands.PDALoginTerminateEventHandler'

1 个答案:

答案 0 :(得分:2)

这是处理程序:

DeinitLoginDialogs 

您将返回引发事件的方法,但处理程序已分配(或未分配):

if ( add ) 
    pc.PDALoginTerminate += new PendingCommands.PDALoginTerminateEventHandler( DeinitLoginDialogs );
else
    pc.PDALoginTerminate -= new PendingCommands.PDALoginTerminateEventHandler( DeinitLoginDialogs );

注意PDALoginTerminateEventHandler构造函数的参数。值得注意的是,转换可以隐式执行,即这种肮脏:

pc.PDALoginTerminate += new PendingCommands.PDALoginTerminateEventHandler( DeinitLoginDialogs );

...变为

pc.PDALoginTerminate += DeinitLoginDialogs;

耶。不幸的是,长名称在这里无法提供可读性。他们也伤了我的头。