【问题标题】:How to avoid Console.Write after Ctrl-C during Console.ReadLine?如何在 Console.ReadLine 期间避免在 Ctrl-C 之后使用 Console.Write?
【发布时间】:2021-09-08 11:14:54
【问题描述】:

我有一个小型 .NET 控制台程序,它要求提供 SQL 凭据(登录名、密码)。问题是,如果我在登录提示(下面的string userId = Console.ReadLine();)期间按Ctrl-C,程序会停止,但"password:" 提示会写入控制台。相关片段:

Console.Write("login: ");
string userId = Console.ReadLine();
    
Console.Write("password: ");

在登录提示期间 Ctrl-C 上的输出:

登录名:密码:

如何避免在使用 Ctrl-C 退出后执行Console.Write("password: ");

更新 1: CancelKeyPress 事件处理程序没有帮助。至少对我来说,它适用于 Console.ReadKey,但不适用于 Console.ReadLine:仍然写入密码提示。

更新2:如果空检查块后有Write/WriteLine,它仍然在我的机器上执行(Win10,VS2019)。所以,问题实际上仍然存在。当前的解决方法 - ReadKey。

【问题讨论】:

标签: .net .net-core console-application


【解决方案1】:

正如 AgentFire 提到的那样,添加输入验证。

    class Program
    {
        static void Main()
        {
            Console.Write("login: ");
            string userId = Console.ReadLine();

            if (string.IsNullOrWhiteSpace(userId))
            {
                Environment.Exit(-1);
            }
            Console.Write("password: ");
            ....
        }

    }

【讨论】:

  • 谢谢,但检查后写仍然为我执行(添加了注释)。显然,我将继续使用 ReadKey。
  • 一种方法,可能是像我在编辑答案时所做的那样反转逻辑 - 当输入为空或为空时结束程序(可能对诊断不太好)。或为所有输入添加检查,或如您所述使用 ReadKey ....
【解决方案2】:

如果你的代码在你按下 Ctrl-C 后确实继续运行(由于某种原因它不在我的机器上),我敢打赌你的 userId 变量将是null,而不是通常的空字符串(如果您不输入任何内容并按 Enter)。

所以,只需检查null

【讨论】:

  • 谢谢,但检查后写仍然为我执行(添加了注释)。显然,我将继续使用 ReadKey。
猜你喜欢
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多