Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:

• Функции, которые объявлялись в классе

Program
, становятся локальными функциями для операторов верхнего уровня. (Локальные функции раскрываются в главе 4.)

• Дополнительные типы можно объявлять после всех операторов верхнего уровня. Объявление любых типов до окончания операторов верхнего уровня приводит к ошибке на этапе компиляции.

"За кулисами" компилятор заполняет пробелы. Исследуя сгенерированный код IL для обновленного кода, вы заметите такое определение

TypeDef
для точки входа в приложение:

// TypeDef #1 (02000002)

// -------------------------------------------------------

// TypDefName: <Program>$ (02000002)

// Flags : [NotPublic] [AutoLayout] [Class] [Abstract] [Sealed] [AnsiClass]

[BeforeFieldInit] (00100180)

// Extends : 0100000D [TypeRef] System.Object

// Method #1 (06000001) [ENTRYPOINT]

// -------------------------------------------------------

// MethodName: <Main>$ (06000001)

Сравните

его с определением
TypeDef
для точки входа в главе 1:

// -------------------------------------------------------

// TypDefName: CalculatorExamples.Program (02000002)

// Flags : [NotPublic] [AutoLayout] [Class] [AnsiClass]

[BeforeFieldInit] (00100000)

// Extends : 0100000C [TypeRef] System.Object

// Method #1 (06000001) [ENTRYPOINT]

// -------------------------------------------------------

// MethodName: Main (06000001)

В примере из главы 1 обратите внимание, что значение

TypDefName
представлено как пространство имен (
CalculatorExamples
) плюс имя класса (
Program
), а значением
MethodName
является
Main
. В обновленном примере, использующем операторы верхнего уровня, компилятор заполняется значение
<Program>$
для
TypDefName
и значение
<Main>$
для имени метода.

Указание кода ошибки приложения (обновление в версии 9.0)

Хотя в подавляющем большинстве случаев методы

Main
или операторы верхнего уровня будут иметь
void
в качестве возвращаемого значения, возможность возвращения
int
(или
Task<int>
) сохраняет согласованность C# с другими языками, основанными на С. По соглашению возврат значения
0
указывает на то, что программа завершилась успешно, тогда как любое другое значение (вроде
– 1
) представляет условие ошибки (имейте в виду, что значение
0
автоматически возвращается даже в случае, если метод
Main
прототипирован как возвращающий
void
).

При использовании операторов верхнего уровня (следовательно, в отсутствие метода

Main
) в случае, если исполняемый код возвращает целое число, то оно и будет кодом возврата. Если же явно ничего не возвращается, тогда все равно обеспечивается возвращение значения
0
, как при явном применении метода
Main
.

В ОС Windows возвращаемое приложением значение сохраняется в переменной среды

по имени
%ERRORLEVEL%
. Если создается приложение, которое программно запускает другой исполняемый файл (тема, рассматриваемая в главе 19), тогда получить значение
%ERRORLEVEL%
можно с применением свойства
ExitCode
запущенного процесса.

Поскольку возвращаемое значение передается системе в момент завершения работы приложения, вполне очевидно, что получить и отобразить финальный код ошибки во время выполнения приложения невозможно. Однако мы покажем, как просмотреть код ошибки по завершении программы, изменив операторы верхнего уровня следующим образом:

// Обратите внимание, что теперь возвращается int, а не void.

// Вывести сообщение и ожидать нажатия клавиши <Enter>.

Console.WriteLine("***** My First C# App *****");

Console.WriteLine("Hello World!");

Console.WriteLine;

Console.ReadLine;

// Возвратить произвольный код ошибки.

return -1;

Если программа в качестве точки входа по-прежнему использует метод

Main
, то вот как изменить сигнатуру метода, чтобы возвращать
int
вместо
void
:

static int Main

{

}

Теперь давайте захватим возвращаемое значение программы с помощью пакетного файла. Используя проводник Windows, перейдите в папку, где находится файл решения (например,

С:\SimpleCSharpApp
), и создайте в ней новый текстовый файл (по имени
SimpleCSharpApp.cmd
). Поместите в файл приведенные далее инструкции (если раньше вам не приходилось создавать файлы
*.cmd
, то можете не беспокоиться о деталях):

@echo off

rem Пакетный файл для приложения SimpleCSharpApp.exe,

rem в котором захватывается возвращаемое им значение.

dotnet run

@if "%ERRORLEVEL%" == "0" goto success

:fail

echo This application has failed!

echo return value = %ERRORLEVEL%

goto end

:success

echo This application has succeeded!

echo return value = %ERRORLEVEL%

goto end

:end

echo All Done.

Откройте окно командной подсказки (или терминал VSC) и перейдите в папку, содержащую новый файл

*.cmd
. Запустите его, набрав имя и нажав <Enter>. Вы должны получить показанный ниже вывод, учитывая, что операторы верхнего уровня или метод
Main
возвращает
– 1
. Если бы возвращалось значение
0
, то вы увидели бы в окне консоли сообщение
This application has succeeded!

Поделиться с друзьями: