Jakie jest polecenie, aby zamknąć aplikację konsoli w języku C #?

Odpowiedzi:

333

Możesz użyć Environment.Exit(0);iApplication.Exit

Environment.Exit(0) jest czystszy .

Nikhil Agrawal
źródło
8
Ciekawe, co czyni go czystszym?
Grant H.
Działa to dla mnie idealnie, gdy dodałem zegar do aplikacji konsoli za pośrednictwem stackoverflow.com/a/7865126/1530166 . Application.Exit tego nie zrobił, nawet podczas korzystania z stackoverflow.com/a/37029044/1530166 .
Jason Anderson
5
@GrantH. jest czystszy, ponieważ daje bazowemu systemowi operacyjnemu bardziej przydatny kod błędu, dlaczego się kończy.
Fayssal El Mofatiche
Jednak Environment.Exitwymaga posiadania SecurityPermissionFlag.UnmanagedCode uprawnień - co może być uciążliwe dla niektórych.
wp78de,
93

Kilka opcji, według najbardziej odpowiedniego sposobu:

  1. Zwraca liczbę całkowitą z metody Program.Main
  2. Zgłaszaj wyjątek i nie obsługuj go nigdzie (użyj w przypadku nieoczekiwanych błędów)
  3. Aby wymusić zakończenie w innym miejscu System.Environment.Exit( nie przenośne! Patrz poniżej )

Edytowano 9/2013 w celu poprawy czytelności

Zwracanie z określonym kodem wyjścia: Jak Servy wskazuje w komentarzach, możesz zadeklarować opcję Main za pomocą inttypu zwracanego i w ten sposób zwrócić kod błędu. Tak więc naprawdę nie ma potrzeby używania Environment.Exit, chyba że musisz zakończyć kodem wyjścia i nie możesz tego zrobić w metodzie Main. Najprawdopodobniej możesz tego uniknąć, zgłaszając wyjątek i zwracając kod błędu w Main, jeśli propaguje się tam nieobsługiwany wyjątek. Jeśli aplikacja jest wielowątkowa, prawdopodobnie będziesz potrzebować jeszcze więcej boksów, aby poprawnie zakończyć kodem wyjścia, więc lepiej jest po prostu wywołać Environment.Exit.

Kolejnym argumentem przeciwko używaniu Evironment.Exit- nawet podczas pisania aplikacji wielowątkowych - jest możliwość ponownego użycia . Jeśli kiedykolwiek zechcesz ponownie użyć kodu w środowisku, które czyni go Environment.Exitnieistotnym (takim jak biblioteka, która może być używana na serwerze WWW), kod nie będzie przenośny. Moim zdaniem najlepszym rozwiązaniem jest zawsze stosowanie wyjątków i / lub zwracanie wartości, które wskazują, że metoda osiągnęła pewien stan błędu / zakończenia. W ten sposób zawsze możesz używać tego samego kodu w dowolnym środowisku .NET i w dowolnym typie aplikacji. Jeśli piszesz konkretnie aplikację, która musi zwrócić kod wyjścia lub zakończyć działanie w sposób podobny do tego Environment.Exit, co robi, możesz następnie owinąć wątek na najwyższym poziomie i w razie potrzeby obsłużyć błędy / wyjątki.

sinelaw
źródło
10
Ta ostatnia opcja jest w złym guście. Żaden programista nie chce wyjść z programu, zgłaszając wyjątek.
Nikhil Agrawal
5
Jak napisałem „na zamówienie najbardziej odpowiednie”. Poza tym w niektórych sytuacjach zgłoszenie wyjątku JEST poprawne (np. Gdy wystąpi nieoczekiwany, krytyczny błąd, który nie powinien się zdarzyć, z którego aplikacja nigdy się nie odzyska). Zaktualizowałem odpowiedź, aby wyjaśnić.
sinelaw
Jeśli jesteś w Main, możesz po prostu zwrócić 0, 1 itd. I oznaczyć sygnaturę metody jako zwracającą liczbę int, aby zwrócić kod błędu, nie musisz używać środowiska. Wyjdź, aby podać kod błędu.
Servy
2
Zależy, jak głęboko jesteś w stosie wywołań i czy jesteś w głównym wątku. Wywołanie środowiska może być prostsze. Wyjdź niż zarchiwizuj cały program, aby powrócić do głównej funkcji bez użycia wyjątku, aby rozwinąć stos wywołań (który nie działałby z wątku w tle; albo ThreadPool przełknąłby wyjątek lub wyrzuciłby go nieobsługiwany, tak czy inaczej logika catch w metodzie głównej lub wątku nigdy tego nie zobaczyłaby
KeithS
Zmieniłem kolejność opcji. Zgłoszenie wyjątku ma tę zaletę, że znacznie ułatwia ponowne użycie kodu jako biblioteki w różnych środowiskach wykonywalnych.
sinelaw
26

Aplikacje konsoli zostaną zamknięte, gdy główna funkcja zakończy działanie. Osiągnie to „powrót”.

    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("I'm running!");
            return; //This will exit the console application's running thread
        }
    }

Jeśli zwracasz kod błędu, możesz to zrobić w ten sposób, który jest dostępny z funkcji spoza początkowego wątku:

    System.Environment.Exit(-1);
Deweloper
źródło
9

Możesz użyć Environment.Exit(0)i Application.Exit.

Environment.Exit(): kończy ten proces i nadaje bazowemu systemowi operacyjnemu określony kod wyjścia.

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
źródło