2017-03-06 15 views
0

我必須按兩次按鈕才能使此代碼在控制檯上顯示按下的按鈕。任何想法這個代碼有什麼問題?C#爲什麼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

要調用Console.ReadKey()兩次,一次獲得字符,一次,以確定是否被按下逃生。

有它只讀一次,改變你的ConsoleRead類是:

​​

這捕獲按下該鍵,然後使用它來創建ReadResult

相關問題