C#实现瑞士转斯科茨代尔时间转换器:个位数分钟输入无响应及显示问题排查
问题定位与修复
触发异常的根因
- 死循环导致程序无响应:原代码中
while (count != 2)循环逻辑存在根本性缺陷- 变量
count是在循环外部提前计算的个位数长度值,循环内即便修改了分钟数值,也不会更新count的取值 - 循环内给
MinuteSwitzerland赋值的ZeroDigits数组元素,本质和原个位数数值完全相等(Byte类型不保留前导零格式,存储01和存储1没有区别),永远达不到count == 2的退出条件,程序会无限卡在循环中没有任何输出
- 变量
- 格式化逻辑失效:用数值类型存带前导零的内容本身无法实现展示效果,数值类型不会保存前导零的格式属性
- 作用域混乱:嵌套的
Minutes方法直接依赖外层Main方法的局部变量做逻辑判断,没有独立的传参和返回逻辑,容易出现状态不同步的问题
修复实现
不需要手动遍历判断补零逻辑,直接借助.NET内置的数字格式化能力,一行代码即可实现个位数分钟补前导零的效果,同时删除所有冗余的无效循环和数组定义。
修复后的运行代码
using System; namespace timezones { class Program { static void Main(string[] args) { Console.WriteLine("What hour is it?"); byte timeSwitzerland = Convert.ToByte(Console.ReadLine()); // 斯科茨代尔比瑞士时间慢8小时 int timeScottsdale = timeSwitzerland - 8; Console.WriteLine("in which minute(s)?"); byte minuteSwitzerland = byte.Parse(Console.ReadLine()); // 处理跨天的时间换算 if (timeScottsdale < 0) { timeScottsdale += 24; } // 内置格式化实现分钟两位数显示,个位数自动补前导零 Console.WriteLine($"it is {timeScottsdale}:{minuteSwitzerland:00} in Scottsdale right now"); } } }
修复效果
- 输入个位数分钟(如输入2)时,输出会自动显示为
02,满足格式化需求 - 彻底移除死循环逻辑,输入任意合法分钟值都能正常返回结果,不会出现程序卡住无响应的问题
- 所有变量显式指定数据类型,去掉无意义的
var声明,提升代码可读性 - 保留原有的时差换算、跨天处理的业务逻辑,不改动原有功能规则
内容的提问来源于stack exchange,提问作者Loewe4444
相关产品推荐
相关产品推荐

