循环条件始终无法满足问题排查: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
相关产品推荐
相关产品推荐

