引入continue语句后,C#控制台do-while循环输入校验失效问题
问题分析与修复
你的代码问题出在continue语句跳过校验后,循环条件没有覆盖所有不合法场景,同时未正确处理解析失败时的num默认值,导致误判:
- 当
int.TryParse失败时,num会被赋值为默认值0。此时continue直接跳转到while条件判断,如果0刚好在min-max范围内且不在exceptions数组里,循环会直接终止,返回错误的0,不会重试输入。 - 当输入的数字不在
permittedNums列表中时,continue跳过后续逻辑,但此时num是一个合法整数,若它满足num >= min && num <= max && !exceptions.Contains(num),循环同样会直接终止,返回不被允许的数值。
修复方案一:整合所有校验到循环条件(更简洁)
把所有不合法条件都放到while判断里,去掉continue,确保只要有一项不满足就重新循环:
public static int GetNumber(int min = int.MinValue, int max = int.MaxValue, string prompt = "Number", int[] permittedNums = null, params int[] exceptions) { string? numString; int num; do { Console.Write($"{prompt}: "); numString = Console.ReadLine(); ClearConsoleLine(); } while (!int.TryParse(numString, out num) || (permittedNums != null && !permittedNums.Contains(num)) || num < min || num > max || exceptions.Contains(num)); return num; }
修复方案二:保留continue,引入合法性标记
如果要保留continue的逻辑,需要添加一个isValid标记,只有当所有校验都通过时才标记为合法,循环条件改为判断标记:
public static int GetNumber(int min = int.MinValue, int max = int.MaxValue, string prompt = "Number", int[] permittedNums = null, params int[] exceptions) { string? numString; int num; bool isValid; do { isValid = false; Console.Write($"{prompt}: "); numString = Console.ReadLine(); ClearConsoleLine(); if (!int.TryParse(numString, out num)) { continue; } if (permittedNums != null && !permittedNums.Contains(num)) { continue; } // 所有校验通过,标记为合法 if (num >= min && num <= max && !exceptions.Contains(num)) { isValid = true; } } while (!isValid); return num; }
内容的提问来源于stack exchange,提问作者moshesilver
相关产品推荐
相关产品推荐

