You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环条件始终无法满足问题排查:WPF页面按钮点击代码异常

问题排查与修复方案

咱们来一步步拆解你代码里的问题,这应该就是导致循环逻辑异常的根源:

1. 循环条件的多余设计

你的循环写的是for (int i = 0; i < mw.pizzas.Length + 1; i++),但mw.pizzas是长度为10的数组,mw.pizzas.Length本身就是10,加1之后循环条件变成了i < 11——这会让循环跑到i=10的情况,可数组的有效索引范围是0~9啊(数组长度为N时,索引从0到N-1)。

虽然你在i==10的时候提前break了,没触发索引越界,但这个+1完全是画蛇添足,还容易把逻辑搞乱:

  • 数组没填满时,循环会在第一个null位置就break,看起来能正常运行,但这只是巧合;
  • 数组填满后,循环会把0~9的索引都遍历一遍,再进入i=10的分支弹提示,这部分逻辑虽然能跑,但写法非常不规范。

2. 判断顺序颠倒了

现在你先检查i==10,再看当前索引的元素是不是null。正常逻辑应该是:先遍历所有有效索引找空位,找不到(也就是数组满了)再弹提示。

修复后的代码

把循环条件改成i < mw.pizzas.Length,同时调整判断顺序,逻辑就清晰多了,还能避免潜在的索引越界问题:

bool isPizzaAdded = false;
for (int i = 0; i < mw.pizzas.Length; i++) 
{ 
    if (mw.pizzas[i] == null) 
    { 
        mw.pizzas[i] = pizza; 
        isPizzaAdded = true;
        break; 
    } 
} 

// 遍历完所有位置都没找到空位,说明已经满了
if (!isPizzaAdded)
{
    MessageBox.Show("You can't order more than 10 pizzas");
}

NavigationService.Content = new AnotherPage();

额外优化建议

  • 如果你用的是C# 8.0及以上版本,可以用LINQ简化找空位的逻辑,代码更简洁:
    var emptySlotIndex = Array.IndexOf(mw.pizzas, null);
    if (emptySlotIndex != -1)
    {
        mw.pizzas[emptySlotIndex] = pizza;
    }
    else
    {
        MessageBox.Show("You can't order more than 10 pizzas");
    }
    
  • 长远来看,用List<string>代替固定长度的数组会更省心,不需要手动管理索引和长度:
    // 先在MainWindow里把pizzas改成List<string>:public List<string> pizzaList = new List<string>();
    if (mw.pizzaList.Count >= 10)
    {
        MessageBox.Show("You can't order more than 10 pizzas");
    }
    else
    {
        mw.pizzaList.Add(pizza);
    }
    

内容的提问来源于stack exchange,提问作者Seminix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:40:11