Udostępnij za pośrednictwem


Instrukcje najwyższego poziomu — programy bez metod Main

Napiwek

Dopiero zaczynasz programować oprogramowanie? Najpierw zacznij od samouczków Wprowadzenie . W tych samouczkach są używane instrukcje najwyższego poziomu, więc znasz już podstawy.

Szukasz alternatywnej Main metody? Zobacz Punkt wejścia metody Main dla jawnego podejścia metody Main.

Użyj instrukcji najwyższego poziomu dla nowych aplikacji. Korzystając z instrukcji najwyższego poziomu, można napisać kod wykonywalny bezpośrednio w katalogu głównym pliku.

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

Console.WriteLine("Hello World!");

Domyślnie, podczas tworzenia nowej aplikacji konsolowej za pomocą dotnet new console, używane są instrukcje najwyższego poziomu. Dobrze sprawdzają się w przypadku programów o dowolnym rozmiarze — od małych narzędzi i usługi Azure Functions po pełne aplikacje. Jeśli masz istniejącą aplikację, która używa jawnej Main metody, nie ma potrzeby jej konwertowania. Oba style są kompilowane do równoważnego 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.

Reguły punktu wejścia

Aplikacja musi mieć tylko jeden punkt wejścia. Projekt może mieć tylko jeden plik z instrukcjami najwyższego poziomu, ale może mieć dowolną liczbę plików kodu źródłowego, które nie mają instrukcji najwyższego poziomu. Można jawnie napisać metodę Main , ale nie może działać jako punkt wejścia. W projekcie z instrukcjami najwyższego poziomu nie można użyć -main opcji kompilatora, aby wybrać punkt wejścia, nawet jeśli projekt ma co najmniej jedną Main metodę.

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, jak wygląda postać podpisu metody, w tabeli dla wygody użyto nazwy metody Main.

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)

Począwszy od języka C# 14, programy mogą być aplikacjami opartymi na plikach, gdzie pojedynczy plik zawiera program. Aplikacje oparte na plikach są uruchamiane przy użyciu polecenia dotnet <file.cs>lub bezpośrednio przy użyciu nazwy pliku w systemie Unix (na przykład ./file.cs). Ta ostatnia wymaga włączenia dyrektywy #!/usr/bin/env dotnet jako pierwszego wiersza i ustawienia pozwolenia do wykonywania (chmod +x <file>).

using Dyrektywy

W przypadku pojedynczego pliku zawierającego using instrukcje najwyższego poziomu, dyrektywy muszą znajdować się na początku tego pliku, jak w poniższym przykładzie:

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;

Przestrzenie nazw i definicje typów

Instrukcje najwyższego poziomu znajdują się domyślnie w globalnej przestrzeni nazw. 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 argumentów wiersza polecenia przekazywanych do aplikacji po jej uruchomieniu. Zmienna args nigdy nie ma wartości null, ale jej Length wynosi 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 i kod zakończenia

Użyj await, aby wywołać metodę asynchroniczną. Gdy kod najwyższego poziomu zawiera awaitelement , kompilator generuje punkt wejścia, który zwraca Taskwartość . Środowisko uruchomieniowe monitoruje je Task do ukończenia, utrzymując proces aktywny do momentu zakończenia wszystkich zadań asynchronicznych. Na przykład:

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

Aby zwrócić kod zakończenia po zakończeniu aplikacji, użyj instrukcji return . Kompilator generuje punkt startowy, który zwraca Task<int>, gdy kod zawiera zarówno await, jak i return, albo int, gdy zawiera tylko return. Na przykład:

string? s = Console.ReadLine();

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