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

C#实现仅允许y/n输入的布尔问询方法问题求助

优化C#输入验证方法:布尔值与数字输入

嘿,我来帮你梳理下这两个输入验证的问题,咱们一步步解决:

一、布尔输入(yes/no/y/n)的优化

你原来的代码核心问题在于**Console.ReadLine()本身不会抛出异常**,所以你的catch块永远不会触发——不管用户输入什么奇怪的内容,只要不是"y"就直接返回false,完全不符合你要的「非法输入抛异常」的需求。

咱们换个思路:先捕获用户输入,然后严格校验是否属于允许的范围,代码可以这么改:

static public bool AskBool(string question)
{
    Console.Write(question);
    // 处理空格+统一转小写,兼容用户输入的大小写和多余空格
    string input = Console.ReadLine()?.Trim().ToLowerInvariant(); 
    
    // 明确校验所有合法输入
    if (input is "y" or "yes")
    {
        return true;
    }
    else if (input is "n" or "no")
    {
        return false;
    }
    else
    {
        throw new FormatException("Only y/n/yes/no are allowed!");
    }
}

这里的优化点:

  • 用?.Trim()处理用户可能误输入的空格,避免无意义的验证失败
  • 转成小写,支持大小写不敏感的输入(比如用户输入"Y"或"Yes"也能正常识别)
  • 只有输入在合法集合内才返回对应布尔值,否则直接抛出异常,完全匹配你的需求

二、数字输入验证的优化

你原来的代码能实现功能,但用int.Parse配合catch的方式其实不够优雅——异常应该用来处理意外情况,而非正常的输入校验。推荐用int.TryParse来实现,代码更高效也更直观:

static public int AskInt(string question)
{
    Console.Write(question);
    string input = Console.ReadLine()?.Trim();
    
    // 尝试解析输入,成功则返回结果,失败抛异常
    if (int.TryParse(input, out int result))
    {
        return result;
    }
    else
    {
        throw new FormatException("Please enter a valid integer number!");
    }
}

这个版本的优势:

  • 避免了不必要的异常捕获,性能更优
  • 逻辑清晰直白:尝试解析输入,成功就返回结果,失败就抛出指定异常
  • 同样处理了输入的空格问题,提升用户体验

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:36:40