Instrukcje najwyższego poziomu — programy bez Main metod

Nie musisz jawnie dołączać Main metody do projektu aplikacji konsolowej. Zamiast tego możesz użyć funkcji instrukcji najwyższego poziomu, aby zminimalizować kod, który trzeba napisać.

Instrukcje najwyższego poziomu umożliwiają pisanie kodu wykonywalnego bezpośrednio w katalogu głównym pliku, eliminując konieczność opakowywania kodu w klasie lub metodzie. Oznacza to, że można tworzyć programy bez ceremonii Program klasy i Main metody. W tym przypadku kompilator generuje klasę Program z metodą punktu wejścia dla aplikacji. Nazwa wygenerowanej metody to nie Main. Jest to szczegół implementacji, do którego kod nie może się odwoływać bezpośrednio.

Oto plik Program.cs, który jest kompletnym programem języka C# w języku C# 10:

Console.WriteLine("Hello World!");

Instrukcje najwyższego poziomu umożliwiają pisanie prostych programów dla małych narzędzi, takich jak Azure Functions i GitHub Actions. Ułatwiają również nowym programistom języka C#rozpoczęcie uczenia się i pisania kodu.

W poniższych sekcjach opisano reguły dotyczące tego, co można i których nie można robić za pomocą instrukcji najwyższego poziomu.

Tylko jeden plik najwyższego poziomu

Aplikacja musi mieć tylko jeden punkt wejścia. Projekt może mieć tylko jeden plik z instrukcjami najwyższego poziomu. Umieszczenie instrukcji najwyższego poziomu w więcej niż jednym pliku w projekcie powoduje następujący błąd kompilatora:

CS8802 Tylko jedna jednostka kompilacji może zawierać instrukcje najwyższego poziomu.

Projekt może mieć dowolną liczbę dodatkowych plików kodu źródłowego, które nie mają instrukcji najwyższego poziomu.

Brak innych punktów wejścia

Można jawnie napisać metodę Main , ale nie może działać jako punkt wejścia. Kompilator generuje następujące ostrzeżenie:

CS7022 Punkt wejścia programu to kod globalny; Ignorując punkt wejścia "Main()".

W projekcie z instrukcjami najwyższego poziomu nie można użyć opcji -main kompilatora, aby wybrać punkt wejścia, nawet jeśli projekt ma co najmniej jedną Main metodę.

using Dyrektyw

Jeśli dołączasz dyrektywy używające, muszą one pojawić się najpierw w pliku, jak w tym przykładzie:

using System.Text;

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

// Display the command line arguments using the args variable.
foreach (var arg in args)
{
    builder.AppendLine($"Argument={arg}");
}

Console.WriteLine(builder.ToString());

// Return a success code.
return 0;

Globalna przestrzeń nazw

Instrukcje najwyższego poziomu są niejawnie w globalnej przestrzeni nazw.

Przestrzenie nazw i definicje typów

Plik z instrukcjami najwyższego poziomu może również zawierać przestrzenie nazw i definicje typów, ale muszą one pochodzić po instrukcjach najwyższego poziomu. Na przykład:

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

Instrukcje najwyższego poziomu mogą odwoływać się do zmiennej args w celu uzyskania dostępu do dowolnych wprowadzonych argumentów wiersza polecenia. Zmienna args nigdy nie ma wartości null, ale jest równa Length zero, jeśli nie podano żadnych argumentów wiersza polecenia. Na przykład:

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

await

Metodę asynchroniową można wywołać przy użyciu polecenia await. Na przykład:

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

Kod zakończenia procesu

Aby zwrócić int wartość po zakończeniu aplikacji, użyj return instrukcji , jak w metodzie zwracającej Main element int. Na przykład:

string? s = Console.ReadLine();

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

Niejawna metoda punktu wejścia

Kompilator generuje metodę służącą jako punkt wejścia programu dla projektu z instrukcjami najwyższego poziomu. Podpis metody zależy od tego, czy instrukcje najwyższego poziomu zawierają await słowo kluczowe lub instrukcję return . W poniższej tabeli przedstawiono wygląd podpisu metody przy użyciu nazwy Main metody w tabeli dla wygody.

Kod najwyższego poziomu zawiera Podpis niejawny Main
await i return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Nie await lub return static void Main(string[] args)

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Specyfikacja funkcji — instrukcje najwyższego poziomu