我已经全力以赴,试图弄明白这段代码实际上应该完成。
在某些情况下,使用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'”
答案 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;
耶。不幸的是,长名称在这里无法提供可读性。他们也伤了我的头。