2010-03-02 1 views
12

Я не понимаю, почему функция C# Main по умолчанию недействительна (например, в проекте консоли). В C и C++ стандарт четко говорит, что main должен возвращать int, и использование возвращаемого значения имеет смысл, потому что мы можем проверить это возвращаемое значение из внешней программы и посмотреть, успешно ли завершилось приложение C/C++ или возникла ошибка.Почему C# использует неявный void Main?

Так что мои вопросы:

  1. Почему Visual Studio объявить Main недействительной?
  2. Каков наилучший способ вернуть значение ОС после завершения консольного приложения C#?

ответ

11

В C#, вы можете использовать, see MSDN:

static int Main() 
static int Main(string[] args) 
static void Main() 
static void Main(string[] args) 

Эта гибкость (спутанность) также существует в C++ и наследуется от C.

Вы также можете вернуть значение (int) двумя способами.

В консольное приложение я использовал бы int Main() { ...; return 2; }

В WinForms/WPF/... приложение, в редких случаях это необходимо возвращаемое значение, я хотел бы использовать
Environment.ExitCode = 1; или Environment.Exit(1);

+1

Существует определенная путаница в C и C++, особенно в старых учебниках, но стандарты ISO как C, так и C++ требуют только 'int main (void)' и 'int main (int, char **)'. 'void main (void)' никогда не был стандартным и его следует избегать. –

+2

Ответчик, похоже, ссылается на то, что вы можете сделать, а не на стандарт. – marr75

16

Вы можете использовать либо INT или недействительным как тип возвращаемого значения. Таким образом, просто измените его и верните значение, как в C++.

Возможно, по умолчанию это недействительно, чтобы не начинать головоломки.

+4

По умолчанию это недействительно, потому что обычно вам не нужно возвращать что-либо из Main() в win-приложении (код возврата унаследован от dos) –

3

Вы можете изменить тип возврата Main без каких-либо проблем.

+2

Можете ли вы изменить его на все, что угодно? Или 'int' и' void' являются единственными опциями? –

+0

Ну, то же самое можно сказать о C и C++ в некоторых ситуациях (в какой-то момент 'void main' считался действительным некоторыми компиляторами). Существует ли стандартный способ объявления Main в C#? – IVlad

6

Причины, по которым разработчики C# решили, что Main объявлен как пустота, я не мог сказать. Что касается возврата значений в ОС, когда приложение закончит вы можете использовать это:

System.Environment.ExitCode = 1; // Or whatever number other than 0 for errors. 
0

Вы может использовать Environment.Exit() для завершения и возврата целочисленного кода в ОС. В качестве альтернативы вы можете установить Environment.ExitCode, и этот код будет возвращен ОС, когда ваша программа будет нормально завершена.

+0

Рассматривается ли это лучше, чем просто объявлять Main как int и возвращать значение? Я предполагаю, что это так, потому что таким образом мы можем выйти из программы с кодом выхода из любой другой функции. – IVlad

+0

@IVlad - Я бы не сказал, что это лучшая практика, просто другой способ сделать это. –

2

Лучший способ вернуть значение выхода - использовать. Я говорю это, потому что ненулевые коды выхода обычно используются для обозначения некоторой ошибки, обычно такой, которую вы не хотите продолжать. Вызов Exit с ненулевым значением выхода сигнализирует об ошибке через значение и выходит из программы.

Environment.Exit(value); 

EDIT: Обратите внимание, что контекст для моего заявления был в Main для консольной программы. Библиотеки и другие методы должны генерировать исключения или возвращать значения ошибок. Только ваша основная процедура должна звонить Exit. Извините, если это не ясно.

+1

-1: Вызов 'Environment.Exit()' - худший вид оператора 'goto' - из любой точки программы, по всем границам до завершения. –

+0

Вы пропустите пункт - Environment.Exit() - это ABEND of .NET. Вы называете это точно, когда вы хотите выйти из программы ненормально, с ненулевым значением выхода, именно потому, что продолжение за пределами этой точки было бы опасным (или бессмысленным). Это очень похоже на раннее возвращение из функции. Я не могу думать о какой-либо ситуации, в которой я бы использовал ее, что было бы лучше, если бы вы создали ложную логику, чтобы довести вас до «конца» программы. Тем не менее, я бы использовал его только в «Main» - вы не хотите, чтобы ваши библиотеки вызывали его, они должны бросать исключения. – tvanfosson

2

Помните, что есть еще одна «коробка» вокруг вашей программы - CLR. Он вернет коды ошибок, когда ваш код выдает необработанное исключение.

7

Это неявно недействительно. Как и в, вы не можете просто объявить main (String [] args) и скомпилировать его как функцию void. Проекты по умолчанию объявляют main() как void, потому что проекты по умолчанию не имеют ничего полезного для возврата из main.

Следует также отметить, что C# не является C или C++. Некоторые из синтаксиса одинаковы, но различия гораздо более широкие.