1

我已经用谷歌的眼光和愚蠢的头脑试图弄清楚这段代码实际上应该完成什么。

在某些情况下,使用 true 的 bool arg 调用以下内容(如此处所示),其他时候为 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'

4

1 回答 1

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;

耶。不幸的是,长名称不利于此处的可读性。他们也伤害了我的头。

于 2013-03-04T23:54:49.073 回答