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

Od jazyka C# 9 nemusíte explicitně zahrnout metodu do projektu Main konzolové aplikace. Místo toho můžete pomocí funkce příkazů nejvyšší úrovně minimalizovat kód, který musíte napsat. V tomto případě kompilátor vygeneruje vstupní bod třídy a Main metody pro aplikaci.

Tady je soubor Program.cs, který je kompletním programem 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. Také novým programátorům v jazyce C# umožňuje začít se učit a psát kód.

Následující části popisují pravidla, 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ě. Vložení příkazů nejvyšší úrovně do více než jednoho souboru v projektu vede k následující chybě kompilátoru:

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

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 můžete Main napsat explicitně, ale nemůže fungovat jako vstupní bod. Kompilátor vygeneruje následující upozornění:

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

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

using Směrnic

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


using System.Text;

StringBuilder builder = new();
builder.AppendLine("Hello");
builder.AppendLine("World!");

Console.WriteLine(builder.ToString());

Globální obor názvů

Příkazy nejvyšší úrovně se implicitně nachází 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í pocovat za příkazy nejvyšší úrovně. Napří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ě mohou odkazovat na args proměnnou pro přístup ke všem zadaným argumentům příkazového řádku. Proměnná args nemá nikdy hodnotu null, ale je Length nulová, pokud nebyly zadány žádné argumenty příkazového řádku. Napří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 . Například:

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

Ukončovací kód pro proces

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

string? s = Console.ReadLine();

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

Metoda implicitního vstupního bodu

Kompilátor vygeneruje metodu , která bude sloužit jako vstupní bod programu pro projekt s příkazy nejvyšší úrovně. Název této metody není ve skutečnosti , jedná se o podrobnosti implementace, na které váš kód nemůže Main odkazovat přímo. Podpis metody závisí na tom, jestli příkazy nejvyšší úrovně obsahují klíčové await slovo nebo return příkaz . Následující tabulka ukazuje, jak by podpis metody vypadal, a pro usnadnění se používá název metody Main v tabulce.

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ě