简单的开关导致堆栈溢出

时间:2014-01-18 16:44:54

标签: c# stack-overflow

为什么这个简单的代码导致了错误的错误:

无法计算表达式,因为当前线程处于堆栈溢出状态。

private void barButtonPanelVisibleCheck_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
    switch (barButtonPanelVisibleCheck.Checked)
    {
        case true:
            this.navBarControl.Visible = false;
            this.barButtonPanelVisibleCheck.Checked = false;
            break;
        case false:
            this.navBarControl.Visible = true;
            this.barButtonPanelVisibleCheck.Checked = true;
            break;
    }

    //or

    if (barButtonPanelVisibleCheck.Checked == true)
    {
        this.navBarControl.Visible = false;
        this.barButtonPanelVisibleCheck.Checked = false;
    }
    else
    {
        this.navBarControl.Visible = true;
        this.barButtonPanelVisibleCheck.Checked = true;
    }

}

3 个答案:

答案 0 :(得分:3)

您正在Checked处理程序中更改Checked:已设置Checked值,因此调用处理程序,设置Checked值等,并且您有一个无限循环。

答案 1 :(得分:2)

由于您在CheckedChanged事件中尝试更改复选框的已检查状态,因此会引发另一个CheckedChanged事件,这将启动一个消耗堆栈内存的无限循环,直到达到StackOverflow异常

尝试使用

停止CheckedChanged事件的递归
 private void barButtonPanelVisibleCheck_CheckedChanged(object sender, 
                             DevExpress.XtraBars.ItemClickEventArgs e)
 {
       try
       {

           this.barButtonPanelVisibleCheck.CheckedChanged -=  
                barButtonPanelVisibleCheck_CheckedChanged;

           ... do your checked changed here

       }
       finally
       {
            this.barButtonPanelVisibleCheck.CheckedChanged +=  
                barButtonPanelVisibleCheck_CheckedChanged;
       }
 }

断开事件处理程序允许更改已检查状态而不重新输入事件处理程序,之后重新连接事件。可能对于这种情况,不需要使用try / finally,但使用finally将确保事件始终重新连接,以防您的代码因异常而失败。

答案 2 :(得分:0)

当检查控件的状态改变时,调用方法barButtonPanelVisibleCheck_CheckedChanged。在该方法中,您更改该控件的Checked属性,这会导致调用方法barButtonPanelVisibleCheck_CheckedChanged。在该方法中,您可以更改该控件的Checked属性。