详解 C# 中 Console.ReadLine() 的用法

详解 C# 中 Console.ReadLine() 的用法

Console.ReadLine() 是 C# 中用于从标准输入流(一般是键盘)读取用户输入的核心方法。它会一直等待,直到用户按下 Enter 键,然后返回输入的所有字符(不包括换行符)作为字符串。


一、基本用法

// 1. 最简单的读取
Console.Write("请输入您的姓名: ");
string name = Console.ReadLine();
Console.WriteLine($"您好, {name}!");

// 2. 直接读取(不提示)
string input = Console.ReadLine();


二、关键特性

  1. 返回值类型

    • 成功输入:返回 string(包含所有字符,包括空格)
    • 输入结束(如 Ctrl+Z):返回 null
    • 空输入(直接按 Enter):返回空字符串 ""
  2. 阻塞行为

    • 程序执行到 ReadLine() 会暂停,直到用户按下 Enter
    • 示例:

      Console.WriteLine("程序开始");
      string text = Console.ReadLine(); // 在此等待
      Console.WriteLine("程序继续");
      

  3. 输入缓冲区

    • 支持多行输入(需多次调用)
    • 支持键盘快捷键:
      • Ctrl+Z:输入结束(Windows)
      • Ctrl+D:输入结束(Linux/macOS)
      • Backspace:删除字符
      • Ctrl+C:终止程序

三、类型转换处理

  1. 数值转换(推荐方式)

    Console.Write("请输入年龄: ");
    string input = Console.ReadLine();
    
    // 安全转换(避免异常)
    if (int.TryParse(input, out int age)) 
    {
        Console.WriteLine($"10年后您将 {age + 10} 岁");
    }
    else
    {
        Console.WriteLine("请输入有效数字!");
    }
    

  2. 其他类型转换

    // 日期转换
    Console.Write("输入生日(yyyy-MM-dd): ");
    if (DateTime.TryParse(Console.ReadLine(), out DateTime birthday))
    {
        Console.WriteLine($"您的星座: {GetZodiac(birthday)}");
    }
    
    // 枚举转换
    Console.Write("选择语言(CN/EN): ");
    if (Enum.TryParse(Console.ReadLine(), true, out Language lang))
    {
        Console.WriteLine($"已切换至 {lang}");
    }
    


四、高级应用技巧

  1. 输入验证循环

    decimal amount;
    bool isValid;
    do 
    {
        Console.Write("输入存款金额(>0): ");
        string input = Console.ReadLine();
        isValid = decimal.TryParse(input, out amount) && amount > 0;
        
        if (!isValid) Console.WriteLine("无效金额!");
    } while (!isValid);
    

  2. 密码输入(隐藏字符)

    Console.Write("输入密码: ");
    var password = new StringBuilder();
    
    while (true)
    {
        ConsoleKeyInfo key = Console.ReadKey(true); // true表明不显示按键
        if (key.Key == ConsoleKey.Enter) break;
        
        if (key.Key == ConsoleKey.Backspace && password.Length > 0)
        {
            password.Remove(password.Length - 1, 1);
            Console.Write(" "); // 删除星号
        }
        else if (!char.IsControl(key.KeyChar))
        {
            password.Append(key.KeyChar);
            Console.Write("*"); // 显示掩码
        }
    }
    Console.WriteLine($"
    验证密码: {password}");
    

  3. 多值输入处理

    Console.Write("输入三个数字(空格分隔): ");
    string[] values = Console.ReadLine().Split(   , StringSplitOptions.RemoveEmptyEntries);
    
    if (values.Length == 3 && 
        double.TryParse(values[0], out double a) &&
        double.TryParse(values[1], out double b) &&
        double.TryParse(values[2], out double c))
    {
        Console.WriteLine($"平均值: {(a+b+c)/3}");
    }
    


五、特殊场景处理

  1. 输入重定向检测

    if (Console.IsInputRedirected) // 从文件/管道读取
    {
        using StreamReader reader = new(Console.OpenStandardInput());
        string data = reader.ReadToEnd();
        Console.WriteLine($"收到 {data.Length} 字符输入");
    }
    else // 正常键盘输入
    {
        Console.WriteLine("键盘模式");
        string input = Console.ReadLine();
    }
    

  2. 超时输入检测

    Console.Write("5秒内输入文本: ");
    var task = Task.Run(() => Console.ReadLine());
    
    if (task.Wait(TimeSpan.FromSeconds(5)))
        Console.WriteLine($"输入: {task.Result}");
    else
        Console.WriteLine("
    时间到!");
    

  3. 异步读取

    async Task ProcessInputAsync()
    {
        Console.WriteLine("后台等待输入...");
        string input = await Task.Run(() => Console.ReadLine());
        Console.WriteLine($"异步收到: {input}");
    }
    


六、常见问题解决方案

  1. 输入包含空格

    Console.Write("输入带空格文本: ");
    string text = Console.ReadLine(); // 自动包含空格
    Console.WriteLine($"长度: {text.Length}"); 
    

  2. 处理空输入

    string input = Console.ReadLine();
    if (string.IsNullOrWhiteSpace(input))
    {
        Console.WriteLine("输入不能为空!");
        // 重新提示...
    }
    

  3. 清除输入缓冲区

    while (Console.KeyAvailable)
        Console.ReadKey(true); // 丢弃未处理按键
    


七、最佳实践

  1. 始终验证输入

    // 错误方式
    int age = int.Parse(Console.ReadLine()); // 可能崩溃
    
    // 正确方式
    if (!int.TryParse(Console.ReadLine(), out int age)) 
    {
        // 处理错误
    }
    

  2. 使用明确提示

    // 模糊提示
    Console.Write("输入值: "); 
    
    // 明确提示
    Console.Write("请输入 1-100 的整数: ");
    

  3. 敏感信息处理

    • 密码:使用掩码输入(如上文密码示例)
    • 信用卡号:部分显示 ****-****-****-1234
  4. 跨平台换行符

    string input = Console.ReadLine();
    // 统一换行符处理
    string normalized = input.Replace("
    ", "
    ").Replace( 
     ,  
     );
    


总结流程图

graph TD
    A[调用 Console.ReadLine] --> B{用户输入}
    B -->|按Enter| C[返回字符串]
    B -->|Ctrl+Z/Ctrl+D| D[返回null]
    C --> E[验证和转换]
    E -->|成功| F[业务处理]
    E -->|失败| G[错误提示]
    G --> B
    D --> H[处理输入结束]

掌握 Console.ReadLine() 的用法是开发交互式控制台应用的基础,结合类型验证和错误处理,可以创建健壮的用户输入流程。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容