Бөлісу құралы:


Выражения верхнего уровня — программы без Main методов

Подсказка

Вы новичок в разработке программного обеспечения? Сначала начните с учебников для начинающих. В этих руководствах используются инструкции верхнего уровня, поэтому вы уже знакомы с основами.

Ищете альтернативный Main метод? См. точку входа основного метода для явного подхода к методу Main.

Используйте инструкции верхнего уровня для новых приложений. С помощью инструкций верхнего уровня можно написать исполняемый код непосредственно в корне файла.

Ниже приведен файл Program.cs, который является полной программой C#:

Console.WriteLine("Hello World!");

При создании консольного приложения с помощью dotnet new consoleон использует инструкции верхнего уровня по умолчанию. Они хорошо работают для программ любого размера — от небольших служебных программ и функций Azure до полных приложений. Если у вас есть существующее приложение, использующее явный Main метод, его не нужно преобразовать. Оба стиля компилируются в эквивалентный код.

В следующих разделах описываются правила, которые определяют использование операторов верхнего уровня.

Правила точки входа

Приложение должно иметь только одну точку входа. Проект может иметь только один файл с операторами верхнего уровня, но он может иметь любое количество файлов исходного кода, которые не имеют инструкций верхнего уровня. Вы можете явно написать Main метод, но он не может функционировать как точка входа. В проекте с операторами верхнего уровня нельзя использовать -main параметр компилятора для выбора точки входа, даже если проект имеет один или несколько Main методов.

Компилятор генерирует метод, который служит в качестве точки входа программы для проекта с входными инструкциями верхнего уровня. Сигнатура метода зависит от того, содержат ли операторы верхнего уровня ключевое слово await или оператор return. В следующей таблице показано, как выглядит сигнатура метода, используя имя Main метода в таблице для удобства.

Код верхнего уровня содержит Неявная сигнатура Main
await и return. static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Ни await, ни return static void Main(string[] args)

Начиная с C# 14, программы могут быть файловыми приложениями, где один файл содержит программу. Приложения на основе файлов выполняются с помощью команды dotnet <file.cs>или непосредственно с помощью имени файла в Unix (например, ./file.cs). Для последнего требуется включить #!/usr/bin/env dotnet директиву в качестве первой строки и задать разрешение на выполнение (chmod +x <file>).

Директивы using

Для одного файла, содержащего инструкции верхнего уровня, using директивы должны быть первыми в этом файле, как показано в следующем примере:

using System.Text;

StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");

foreach (var arg in args)
{
    builder.AppendLine($"Argument={arg}");
}

Console.WriteLine(builder.ToString());

return 0;

Пространства имен и определения типов

Операторы верхнего уровня неявно находятся в глобальном пространстве имен. Файл с операторами верхнего уровня может также содержать пространства имен и определения типов, но они должны следовать за операторами верхнего уровня. Например:

MyClass.TestMethod();
MyNamespace.MyClass.MyMethod();

public class MyClass
{
    public static void TestMethod()
    {
        Console.WriteLine("Hello World!");
    }
}

namespace MyNamespace
{
    class MyClass
    {
        public static void MyMethod()
        {
            Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!");
        }
    }
}

args

Высокоуровневые операторы могут ссылаться на переменную args, чтобы получить доступ к любым аргументам командной строки, переданным приложению при его запуске. Переменная args никогда не null, но ее Length равно нулю, если аргументы командной строки не заданы. Например:

if (args.Length > 0)
{
    foreach (var arg in args)
    {
        Console.WriteLine($"Argument={arg}");
    }
}
else
{
    Console.WriteLine("No arguments");
}

await и код выхода

Используется await для вызова асинхронного метода. Когда код верхнего уровня содержит await, компилятор создает точку входа, возвращающую объект Task. Среда выполнения отслеживает Task до завершения, поддерживая процесс активным, пока не завершатся все асинхронные задачи. Например:

Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");

Чтобы вернуть код выхода при завершении приложения, используйте инструкцию return . Компилятор создает точку входа, которая возвращается Task<int> , когда код содержит оба await и return, или int когда он содержит только return. Например:

string? s = Console.ReadLine();

int returnValue = int.Parse(s ?? "-1");
return returnValue;