Příkazy nejvyšší úrovně – programy bez Main metod

Do projektu konzolové aplikace nemusíte explicitně zahrnout metodu Main . Místo toho můžete pomocí funkce příkazů nejvyšší úrovně minimalizovat kód, který musíte napsat.

Příkazy nejvyšší úrovně umožňují psát spustitelný kód přímo v kořenovém adresáři souboru, což eliminuje potřebu zabalení kódu do třídy nebo metody. To znamená, že můžete vytvářet programy bez obřadu Program třídy a Main metody. V tomto případě kompilátor vygeneruje Program třídu s metodou vstupního bodu pro aplikaci. Název vygenerované metody není Main, jedná se o podrobnosti implementace, na které váš kód nemůže odkazovat přímo.

Tady je soubor Program.cs , který je úplným programem jazyka C# v jazyce C# 10:

Console.WriteLine("Hello World!");

Příkazy nejvyšší úrovně umožňují psát jednoduché programy pro malé nástroje, jako jsou Azure Functions a GitHub Actions. Zjednodušují také novým programátorům jazyka C#, aby se mohli začít učit a psát kód.

Následující části popisují pravidla toho, co můžete a nemůžete dělat s příkazy nejvyšší úrovně.

Pouze jeden soubor nejvyšší úrovně

Aplikace musí mít pouze jeden vstupní bod. Projekt může mít pouze jeden soubor s příkazy nejvyšší úrovně. Umístění příkazů nejvyšší úrovně do více než jednoho souboru v projektu vede k následující chybě kompilátoru:

CS8802 Pouze jedna kompilační jednotka může mít příkazy nejvyšší úrovně.

Projekt může mít libovolný počet dalších souborů zdrojového kódu, které nemají příkazy nejvyšší úrovně.

Žádné další vstupní body

Metodu Main můžete napsat explicitně, ale nemůže fungovat jako vstupní bod. Kompilátor vydává následující upozornění:

CS7022 Vstupní bod programu je globální kód; ignoruje vstupní bod Main().

V projektu s příkazy nejvyšší úrovně nemůžete použít možnost -main kompilátoru k výběru vstupního bodu, i když má projekt jednu nebo více Main metod.

using Směrnic

Pokud zahrnete direktivy using, musí být v souboru jako v tomto příkladu:

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;

Globální obor názvů

Příkazy nejvyšší úrovně jsou implicitně v globálním oboru názvů.

Obory názvů a definice typů

Soubor s příkazy nejvyšší úrovně může také obsahovat obory názvů a definice typů, ale musí pocházet za příkazy nejvyšší úrovně. Příklad:

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

Příkazy nejvyšší úrovně můžou odkazovat na args proměnnou pro přístup k zadaným argumentům příkazového řádku. Proměnná args není nikdy null, ale její Length hodnota je nula, pokud nebyly zadané žádné argumenty příkazového řádku. Příklad:

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

await

Asynchronní metodu můžete volat pomocí await. Příklad:

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

Ukončovací kód procesu

Chcete-li vrátit int hodnotu po ukončení aplikace, použijte return příkaz jako v Main metodě, která vrací int. Příklad:

string? s = Console.ReadLine();

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

Implicitní metoda vstupního bodu

Kompilátor vygeneruje metodu, která slouží jako vstupní bod programu pro projekt s příkazy nejvyšší úrovně. Podpis metody závisí na tom, zda příkazy nejvyšší úrovně obsahují await klíčové slovo nebo return příkaz. Následující tabulka ukazuje, jak by podpis metody vypadal, a to pomocí názvu Main metody v tabulce pro usnadnění práce.

Kód nejvyšší úrovně obsahuje Implicitní Main podpis
await a return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Ne await nebo return static void Main(string[] args)

specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Specifikace funkcí – příkazy nejvyšší úrovně