Несмотря на ReadLine() программа закрывается

У меня возникла странная проблема. Я создаю объект (внутри этого объекта я вызываю readline..), затем программа завершает работу, несмотря на то, что в конце я вызвал ReadLine().

Почему это не останавливается? Как сделать так, чтобы он останавливался?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Funkcjonalnosc {

    class MainClass {
        static void Main(string[] args) {
            new MainMenu();         
            Console.ReadLine();
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Funkcjonalnosc {
   public class MainMenu {
        int selection;
        public MainMenu() {
            showMenu();
            selection = getSelection();
            Console.WriteLine("Wybrano "+ selection);
            switch (selection) {
                case 1: break; //strojenie
                case 2: break; //pobieranie stroju
            }
        }
        void showMenu() {
            String menu = "1. Nastrój\n2. Dodaj strój";
            Console.WriteLine(menu);
        }

        int getSelection() {//pobiera wybrana opcje z menu{
            try {
                return Console.Read();
            } catch (Exception e) { Console.WriteLine("Zly wybor"); getSelection(); }
            return -1;
        }
    }
}

person Robert    schedule 13.11.2012    source источник
comment
кстати, я бы не считал хорошей практикой делать все это в конструкторе.   -  person Marc Gravell    schedule 13.11.2012
comment
вы пробовали .ReadKey(); вместо?   -  person CuccoChaser    schedule 13.11.2012
comment
Это происходит потому, что ваш код дает сбой до этого   -  person Sohail    schedule 13.11.2012


Ответы (1)


Из MSDN на Console.Read:

Метод Read блокирует свой возврат, пока вы вводите вводимые символы; он завершается, когда вы нажимаете клавишу Enter

Поэтому, если я наберу, скажем, 1, ничего не произойдет, пока я не наберу enter. Когда я это делаю, Console.Read возвращает 1, но enter все еще буферизуется. Когда вы используете Console.ReadLine, он извлекает этот буферизованный enter, поэтому немедленно завершает работу. Вы можете увидеть это, набрав 123enterRead выберет 1 - и ReadLine извлекает оставшиеся 23.

Чтобы избежать такого поведения буферизации, вы можете вместо этого попробовать Console.ReadKey.

person Marc Gravell    schedule 13.11.2012