Яка команда для виходу із програми консолі в C #?


Відповіді:


333

Ви можете використовувати Environment.Exit(0);іApplication.Exit

Environment.Exit(0) чистіше .


8
Просто цікаво, що робить його більш чистим?
Грант Х.

Це прекрасно працювало для мене, коли я додав таймер у консольний додаток через stackoverflow.com/a/7865126/1530166 . Application.Exit цього не робив, навіть коли використовував stackoverflow.com/a/37029044/1530166 .
Джейсон Андерсон

5
@GrantH. вона чистіша, тому що дає базовій операційній системі корисніший код помилки, чому вона виходить.
Файсал Ель Мофатіче

Однак Environment.Exitпотрібно мати дозволи SecurityPermissionFlag.UnmanagedCode - які для деяких можуть бути проблемними.
wp78de

93

Кілька варіантів, за порядком найбільш підходящого способу:

  1. Повернути int з методу Program.Main
  2. Накиньте виняток і не обробляйте його ніде (використовуйте для несподіваних ситуацій помилок)
  3. Щоб примусити припинення роботи в іншому місці System.Environment.Exit( не портативно! Див. Нижче )

Відредаговано 9/2013 для поліпшення читабельності

Повернення з конкретним кодом виходу: Як в коментарях вказує Сервій, ви можете оголосити Main з intтипом повернення і таким чином повернути код помилки. Тож насправді немає необхідності використовувати Environment.Exit, якщо вам не потрібно скасувати код виходу і неможливо зробити це методом Main. Найімовірніше, ви можете цього уникнути, кинувши виняток і повернувши код помилки в Main, якщо там розповсюджується якийсь необроблений виняток. Якщо додаток багатопотоковий, вам, мабуть, знадобиться ще більше шаблону для належного завершення з кодом виходу, так що вам може бути краще просто зателефонувати в Environment.Exit.

Ще один момент проти використання Evironment.Exit- навіть при написанні багатопотокових програм - це повторне використання . Якщо ви коли-небудь захочете повторно використовувати свій код у середовищі, яке не має Environment.Exitзначення (наприклад, бібліотеці, яка може використовуватися на веб-сервері), код не буде переносним. Найкращим рішенням, на мою думку, є завжди використовувати винятки та / або повертаючі значення, які означають, що метод досяг певної помилки / стану закінчення. Таким чином, ви завжди можете використовувати один і той же код у будь-якому середовищі .NET і в будь-якому типі додатків. Якщо ви спеціально пишете додаток, якому потрібно повернути вихідний код або завершити таким чином, як Environment.Exitце робиться, ви можете піти вперед і обернути нитку на найвищому рівні та обробляти помилки / винятки за необхідності.


10
Останній варіант - в поганому смаку. Жоден програміст не хоче вийти з програми, кинувши виняток.
Nikhil Agrawal

5
Як я написав "за наказом найдоречнішого". Крім того, у певних ситуаціях кидання виключення - це правильний спосіб (наприклад, коли трапляється несподівана, фатальна помилка, якої не повинно статися, з якої програма ніколи не відновиться). Я оновив відповідь, щоб уточнити.
sinelaw

Якщо ви перебуваєте в Main, ви можете просто повернути 0, 1 і т.д. і позначити підпис методу як повернення int для повернення коду помилки, НЕ ПОТРІБНО використовувати Environment.Exit, щоб вказати код помилки.
Сервіс

2
Залежить від того, наскільки глибоко ви знаходитесь у стеці викликів та чи є ви в основній темі. Викликати Environment.Exit можна простіше, ніж архітектувати всю вашу програму, щоб повернути всю головну функцію без використання винятку для розмотування стека виклику (який би не працював із фонової нитки; або ThreadPool не проковтне виняток або викине його без оброблення, інакше будь-яка логіка лову в головному методі чи потоці ніколи не побачить цього
KeithS

Я змінив порядок варіантів. Якщо викинути виняток, це перевага у тому, що ваш код набагато простіше використовувати як бібліотеку в різних виконуваних середовищах.
sinelaw

26

Консольні програми вийдуть, коли основна функція закінчиться. «Повернення» цього досягне.

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

Якщо ви повертаєте код помилки, ви можете зробити це таким чином, який доступний через функції поза початковою ниткою:

    System.Environment.Exit(-1);

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.