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 using
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 await
av . 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.