C#如何评估逻辑块?

时间:2009-08-26 04:31:20

标签: c# .net

我有以下代码行:

    public bool dcpl_radar()
    {
        if (radar == null)
            return false;
        else
        {
            if (radar != null)
            {
                if (radar.InvokeRequired)
                    radar.BeginInvoke(new MethodInvoker(delegate() 
                                                { 
                                                    radar.Visible = false; 
                                                }));
                else
                    this.radar.Visible = false;

                radar = null;
            }
            return true;
        }//end of else statement
    }

但是VStudio不断在调用行上抛出错误。我检查了调试器,如果(雷达== null)是真的,但VStudio正在尝试评估它不应该在的部分代码。有人可以解释为什么这样做请?

2 个答案:

答案 0 :(得分:4)

等一下......我想我们有竞争条件。 让我们说你BeginInvoke,几乎立即你设置雷达= null。 真的没有人知道你的匿名代表何时会被执行。

我认为这可以解决你的问题。

public bool dcpl_radar()
{
    if (radar != null)
    {
        if (radar.InvokeRequired)
        {
            radar.BeginInvoke(new MethodInvoker(HideRadar));
        }
        else
        {
            HideRadar();
        }

        return true;
    }

    return false;
}

private void HideRadar()
{
    this.radar.Visible = false;
    this.radar = null;
}

答案 1 :(得分:1)

发生了什么:

在将radar设置为null后,将调用匿名委托。

如何修复

public bool dcpl_radar()
{
    if (radar == null)
        return false;
    else
    {
        if (radar != null)
        {
            if (radar.InvokeRequired)
                radar.BeginInvoke(new MethodInvoker(delegate() 
                                            { 
                                                radar.Visible = false; 
                                                radar = null;
                                            }));
            else {
                this.radar.Visible = false;
                radar = null;
            }


        }
        return true;
    }//end of else statement
}

(注意我已经移动了'null'作业)。

虽然我有点担心将变量设置为null,但这通常表明设计不合理。