2017-03-06 8 views
0

このコードがコンソールに押されたボタンを表示するためには、ボタンを2回押さなければなりません。このコードで何が間違っているのでしょうか?C#このコードで2つのキーストロークが必要なConsole.ReadKeyはなぜですか?

コードをトレースしてデバッグしようとしましたが、キーを押したときに読み取りと書き込みのブレークポイントがwhileループで常に発生するとは限りません。

using System; 
    using System.IO; 
    namespace ConsoleApplication3 
    { 
    public class Program 
    { 
     private interface IReader 
     { 
      ReadResult Read(); 
     } 

     private interface IWriter 
     { 
      void Write(char character); 
     } 

     public class ConsoleWriter : IWriter 
     { 
      public void Write(char character) 
      { 
       Console.Write(character); 
      } 
     } 

     public class FileWriter : IWriter, IDispose 
     { 
      private readonly StreamWriter _streamWriter; 

      public FileWriter(StreamWriter streamWriter) 
      { 
       _streamWriter = streamWriter; 
      } 

      public void Write(char character) 
      { 
       _streamWriter.Write(character); 
      } 

      public void Dispose() 
      { 
       _streamWriter.Dispose(); 
      } 
     } 

     public class ConsoleRead : IReader 
     { 
      public ReadResult Read() 
      { 
       return new ReadResult(Console.ReadKey(true).KeyChar, Console.ReadKey(true).Key == ConsoleKey.Escape); 
      } 
     } 

     private static void Main(string[] args) 
     { 
      IReader reader = new ConsoleRead(); 
      IWriter writer = new ConsoleWriter(); 
      Copy(reader, writer); 
     } 

     private static void Copy(IReader MyReader, IWriter MyWriter) 
     { 
      while (true) 
      { 
       var readResult = MyReader.Read(); 

       if (readResult._shouldQuit) 
        break; 
       MyWriter.Write(readResult._readCharacter); 
      } 
     } 

     public interface IDispose 
     { 
      void Dispose(); 
     } 

     public class ReadResult 
     { 
      public readonly char _readCharacter; 
      public readonly bool _shouldQuit; 

      public ReadResult(char ReadCharacter, bool ShouldQuit) 
      { 
       _readCharacter = ReadCharacter; 
       _shouldQuit = ShouldQuit; 
      } 
     } 

    } 
} 

答えて

1

あなたは、この機能で二回ReadKeyを呼んでいる:

public ReadResult Read() 
{ 
    return new ReadResult(Console.ReadKey(true).KeyChar, Console.ReadKey(true).Key == ConsoleKey.Escape); 
} 

変数に一度、店にそれを呼び出します。明確化のため

public ReadResult Read() 
{ 
    var temp = Console.ReadKey(true); 
    return new ReadResult(temp.KeyChar, temp.Key == ConsoleKey.Escape); 
} 
+0

おかげで多くのことを – user3726459

1

あなたは文字を取得するには、一度脱出が押されたかどうかを判断するために1回、2回Console.ReadKey()を呼んでいます。

、それは一度だけ読ま持つようにあなたのConsoleReadクラスを変更するには:

​​

これは、押されたキーをキャプチャするには、その後、ReadResultを作成するためにそれを使用しています。

関連する問題