none
程序运行到Console.Read()方法并没有停止等待键盘输入 RRS feed

  • 问题

  • int i1 = 123;
    decimal d1 = (decimal)i1;
    Console.WriteLine(d1);
    Console.Read();

    int i2 = 456;
    object o2 = i2;
    int _i2 = (int)o2;
    Console.WriteLine(_i2);
    // 程序运行到这个Read()方法并没有停止等待键盘输入
    // 而是直接输出了“abc”
    Console.Read();
    Console.WriteLine("abc");
    Console.Read();

    难道有什么特殊情况,程序遇到Console.Read()方法不停止?


    做最好的自己
    2009年8月10日 3:09

答案

  •   static void Main(string[] args)
            {int i1 = 123;
    decimal d1 = (decimal)i1;
    Console.WriteLine(d1);
    Console.Read();

    int i2 = 456;
    object o2 = i2;
    int _i2 = (int)o2;
    Console.WriteLine(_i2);
    // 程序运行到这个Read()方法并没有停止等待键盘输入
    // 而是直接输出了“abc”
    Console.ReadKey(); 这里加这个
    Console.WriteLine("abc");
    Console.Read();

    2009年8月10日 3:52
  • 你好!
         我详细解释一下你遇到的“奇怪”现象:
         这主要和Read方法的处理方式有关,第一次执行到Read方法的时候,这时会发生阻塞,当你按了Enter,阻塞解除,同时会在输入内容上添加一个终止序列(Windows下是回车符和换行符)这个时候出入内容只有(\r\n这两个字符),这个Read方法检索的是回车符(\r)。
         然后执行到第二次调用Read方法,这次调用的Read方法检索的是换行符(\n)。注意这已经是最后一个字符了
         第三次调用Read方法,这是输入内容的所有字符已经检索完毕了,所以Read方法会重新使你的程序处于阻塞状态,如果后续还有Read方法的调用,那么又是新的一次轮回,重复我上面提到检索的步骤!

          Read方法的处理方式是:
          第一次调用会阻塞你的程序,直到输入Enter,同时会在输入内容上添加一个终止序列(Windows下是回车符和换行符)
          后续的Read方法调用不会阻塞你的程序,直到Read方法检索完毕了最后一个字符,这时如果要再调用Read方法,程序又会再次处于阻塞状态了,就像第一次调用Read方法一样,但是这又是新的一次轮回了!
         
          希望这个解释能对你有帮助!
    周雪峰
    2009年8月10日 16:20
    版主

全部回复

  • 你好 你可以用ReadLine方法 取代


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月10日 3:30
    版主
  •   static void Main(string[] args)
            {int i1 = 123;
    decimal d1 = (decimal)i1;
    Console.WriteLine(d1);
    Console.Read();

    int i2 = 456;
    object o2 = i2;
    int _i2 = (int)o2;
    Console.WriteLine(_i2);
    // 程序运行到这个Read()方法并没有停止等待键盘输入
    // 而是直接输出了“abc”
    Console.ReadKey(); 这里加这个
    Console.WriteLine("abc");
    Console.Read();

    2009年8月10日 3:52
  • 这样好像不可以。
    做最好的自己
    2009年8月10日 4:44
  • Read  从标准输入流读取下一个字符。
    ReadKey  已重载。 获取用户按下的下一个字符或功能键。
    ReadLine  从标准输入流读取下一行字符。

    以上是MSDN对三个方法的说明。这么讲不是很明白。“标准输入流”是怎么解释呢?为什么第一个Read()方法可以,第二个却不可以呢?


    做最好的自己
    2009年8月10日 4:44
  • 你好!
         我详细解释一下你遇到的“奇怪”现象:
         这主要和Read方法的处理方式有关,第一次执行到Read方法的时候,这时会发生阻塞,当你按了Enter,阻塞解除,同时会在输入内容上添加一个终止序列(Windows下是回车符和换行符)这个时候出入内容只有(\r\n这两个字符),这个Read方法检索的是回车符(\r)。
         然后执行到第二次调用Read方法,这次调用的Read方法检索的是换行符(\n)。注意这已经是最后一个字符了
         第三次调用Read方法,这是输入内容的所有字符已经检索完毕了,所以Read方法会重新使你的程序处于阻塞状态,如果后续还有Read方法的调用,那么又是新的一次轮回,重复我上面提到检索的步骤!

          Read方法的处理方式是:
          第一次调用会阻塞你的程序,直到输入Enter,同时会在输入内容上添加一个终止序列(Windows下是回车符和换行符)
          后续的Read方法调用不会阻塞你的程序,直到Read方法检索完毕了最后一个字符,这时如果要再调用Read方法,程序又会再次处于阻塞状态了,就像第一次调用Read方法一样,但是这又是新的一次轮回了!
         
          希望这个解释能对你有帮助!
    周雪峰
    2009年8月10日 16:20
    版主