Toppnivåinstruktioner – program utan Main metoder

Du behöver inte uttryckligen inkludera en Main metod i ett konsolprogramprojekt. I stället kan du använda funktionen för toppnivåinstruktioner för att minimera den kod som du måste skriva.

Med toppnivåinstruktioner kan du skriva körbar kod direkt i roten av en fil, vilket eliminerar behovet av att omsluta koden i en klass eller metod. Det innebär att du kan skapa program utan ceremoni av en Program klass och en Main metod. I det här fallet genererar kompilatorn en Program klass med en startpunktsmetod för programmet. Namnet på den genererade metoden är inte Main, det är en implementeringsinformation som koden inte kan referera direkt till.

Här är en Program.cs fil som är ett fullständigt C#-program i C# 10:

Console.WriteLine("Hello World!");

Med toppnivåinstruktioner kan du skriva enkla program för små verktyg som Azure Functions och GitHub Actions. De gör det också enklare för nya C#-programmerare att komma igång med att lära sig och skriva kod.

I följande avsnitt förklaras reglerna för vad du kan och inte kan göra med toppnivåinstruktioner.

Endast en toppnivåfil

Ett program får bara ha en startpunkt. Ett projekt kan bara ha en fil med toppnivåinstruktioner. Om du placerar toppnivåinstruktioner i mer än en fil i ett projekt resulterar följande kompilatorfel:

CS8802 Endast en kompileringsenhet kan ha toppnivåinstruktioner.

Ett projekt kan ha valfritt antal ytterligare källkodsfiler som inte har toppnivåinstruktioner.

Inga andra startpunkter

Du kan skriva en Main metod explicit, men den kan inte fungera som en startpunkt. Kompilatorn utfärdar följande varning:

CS7022 Startpunkten för programmet är global kod. ignorerar startpunkten Main().

I ett projekt med toppnivåinstruktioner kan du inte använda kompilatoralternativet -main för att välja startpunkten, även om projektet har en eller flera Main metoder.

using Direktiv

Om du inkluderar användning av direktiv måste de komma först i filen, som i det här exemplet:

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;

Globalt namnområde

Toppnivåinstruktioner finns implicit i det globala namnområdet.

Namnområden och typdefinitioner

En fil med toppnivåinstruktioner kan också innehålla namnområden och typdefinitioner, men de måste komma efter toppnivåinstruktionerna. Till exempel:

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

Toppnivåinstruktioner kan referera till variabeln args för att få åtkomst till alla kommandoradsargument som har angetts. Variabeln args är aldrig null, men den Length är noll om inga kommandoradsargument har angetts. Till exempel:

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

await

Du kan anropa en asynkron metod med hjälp awaitav . Till exempel:

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

Avsluta koden för processen

Om du vill returnera ett int värde när programmet slutar använder du -instruktionen return som i en Main metod som returnerar en int. Till exempel:

string? s = Console.ReadLine();

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

Implicit startpunktsmetod

Kompilatorn genererar en metod som fungerar som programinmatningspunkt för ett projekt med toppnivåinstruktioner. Metodens signatur beror på om toppnivåinstruktionerna innehåller nyckelordet await eller -instruktionen return . I följande tabell visas hur metodsignaturen skulle se ut med hjälp av metodnamnet Main i tabellen för enkelhetens skull.

Toppnivåkod innehåller Implicit Main signatur
await och return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Nej await eller return static void Main(string[] args)

Språkspecifikation för C#

Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.

Funktionsspecifikation – instruktioner på toppnivå