代码之家  ›  专栏  ›  技术社区  ›  novski

为什么console.readkey().key.tostring按一次会得到小写和大写字母?

  •  0
  • novski  · 技术社区  · 7 年前

    当我按一个键(R)时,这个snipet输出两个字母。

    string key = string.Empty;
    key = Console.ReadKey().Key.ToString();
    Console.WriteLine(key);
    Console.ReadKey();
    // Output: rR
    

    为什么我只按一次小写的“r”就输出小写的“r”和大写的“r”?

    4 回复  |  直到 7 年前
        1
  •  0
  •   Rafal    7 年前

    小写 r 是你用键盘写的。您不能通过阅读从控制台中删除它。还有大写字母 R Key ConsoleKeyInfo 结构。如果您想准确地读取写入控制台的内容,请使用 Console.Read() Console.ReadLine() .

        2
  •  0
  •   user1672994    7 年前

    Console.ReadKey 返回 ConsoleKeyInfo 公开属性的对象 Key 哪个是 ConsoleKey 类型。何处 钥匙 代表 enum 大写字母的值。见下文。

    enter image description here

    在你的情况下,你是第一次阅读 r 使用 Console.ReadKey() 你输出的代码使用 Console.WriteLine 将键值打印为 R

        3
  •  0
  •   Chrᴉz remembers Monica    7 年前

    这个 Key -属性返回枚举的值。 ConsoleKey 。 枚举 控制台键 对每个非修改键都具有等效项(alt、shift和ctrl;请参见枚举 ConsoleModifiers ) 因此,按“R”键可产生两种可能的迹象。

    另一个例子是当你按下 4 在你的钥匙上面的一行数字里。这就是 控制台键 D4。它可以是 key.KeyChar ) $ . 还要注意属性 Modifiers ConsoleKeyInfo -类,它显示按下的修改键。

    请参见下面的示例来说明它:

    var key = Console.ReadKey();//press 4
    Console.WriteLine("ConsoleKey: " + key.Key); // D4
    Console.WriteLine("Char: " + key.KeyChar); // 4
    Console.WriteLine("ConsoleModifier: " + key.Modifiers); // 0
    
    key = Console.ReadKey(); //press shift + 4
    Console.WriteLine("ConsoleKey: " + key.Key); // D4
    Console.WriteLine("Char: " + key.KeyChar); // $
    Console.WriteLine("ConsoleModifier: " + key.Modifiers); // Shift
    

    我从 MSDN

    顺便说一句:我只在按“R”或“R”时得到“R”。我在用C 6和.NET 4.7。也许您使用的是较新或较旧的版本,它输出所有可能的字符,而不是枚举值本身 .ToString() 就像我一样。

        4
  •  0
  •   Simon    6 年前

    老问题,但我想这可能是有用的补充。

    正如其他人所指出的, Console.ReadKey() 是否同时读取输入的密钥并将其写入屏幕(在 Console.WriteLine() 生效)。

    如果只想读取输入而不想写入,可以使用 console.readkey() 要隐藏用户输入,然后稍后编写:

    ConsoleKeyInfo cki = Console.ReadKey(true); // hiding input
    Console.Write($"You pressed: {cki.Key}");
    
    // press letter "a" (lower case)
    // Output: You pressed: A
    // i.e. no duplicated letter
    
    Console.ReadLine();
    

    Link to MSDN section

    如果需要小写输出,只需稍作修改:

    ConsoleKeyInfo cki = Console.ReadKey(true); // hiding input
    Console.Write($"You pressed: {cki.Key.ToString().ToLower()}");
    // press letter "a" (lower case)    
    // Output: You pressed: a
    
    Console.ReadLine();