Legfelső szintű utasítások – metódusok nélküli Main programok

Nem kell explicit módon belefoglalnia egy metódust Main egy konzolalkalmazás-projektbe. Ehelyett a legfelső szintű utasítások funkcióval minimalizálhatja az írandó kódot.

A legfelső szintű utasítások lehetővé teszik a végrehajtható kód írását közvetlenül a fájl gyökerénél, így nincs szükség a kód osztályba vagy metódusba való körbefuttatására. Ez azt jelenti, hogy egy osztály és egy ProgramMain metódus ceremónia nélkül hozhat létre programokat. Ebben az esetben a fordító létrehoz egy osztályt Program az alkalmazás belépési pont metódusával. A létrehozott metódus neve nem Mainolyan implementációs részlet, amelyet a kód nem tud közvetlenül hivatkozni.

Íme egy Program.cs fájl, amely egy teljes C# program a C# 10-ben:

Console.WriteLine("Hello World!");

A legfelső szintű utasítások segítségével egyszerű programokat írhat kis segédprogramokhoz, például az Azure Functionshez és a GitHub Actionshez. Emellett egyszerűbbé teszik az új C#-programozók számára a kód tanulásának és írásának megkezdését.

A következő szakaszok ismertetik a felső szintű utasításokra vonatkozó szabályokat, és mit nem.

Csak egy legfelső szintű fájl

Egy alkalmazásnak csak egy belépési ponttal kell rendelkeznie. Egy projekt csak egy legfelső szintű utasításokkal rendelkező fájllal rendelkezhet. Ha egy projektben több fájlba helyezi a legfelső szintű utasításokat, az a következő fordítóhibát eredményezi:

CS8802 Csak egy fordítási egység rendelkezhet legfelső szintű utasításokkal.

A projektek tetszőleges számú további forráskódfájllal rendelkezhetnek, amelyek nem rendelkeznek legfelső szintű utasításokkal.

Nincs más belépési pont

A metódusokat Main explicit módon is megírhatja, de nem működhet belépési pontként. A fordító a következő figyelmeztetést adja ki:

CS7022 A program belépési pontja globális kód; figyelmen kívül hagyva a "Main()" belépési pontot.

A legfelső szintű utasításokkal rendelkező projektekben a -main fordítóval nem választhatja ki a belépési pontot, még akkor sem, ha a projekt egy vagy több Main metódussal rendelkezik.

using Irányelvek

Ha irányelveket használ, először a fájlban kell szerepelniük, ahogyan az alábbi példában is látható:

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ális névtér

A legfelső szintű utasítások implicit módon szerepelnek a globális névtérben.

Névterek és típusdefiníciók

A legfelső szintű utasításokkal rendelkező fájlok névtereket és típusdefiníciókat is tartalmazhatnak, de a legfelső szintű utasítások után kell lenniük. Példa:

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

A felső szintű utasítások hivatkozhatnak a változóra a args beírt parancssori argumentumok eléréséhez. A args változó soha nem null, de Length nulla, ha nem adtak meg parancssori argumentumokat. Példa:

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

await

Az aszinkron metódust a következővel awaithívhatja meg: . Példa:

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

Kilépési kód a folyamathoz

Ha egy értéket szeretne visszaadni int , amikor az alkalmazás véget ér, használja az return utasítást, ahogyan egy Main metódusban inttenné. Példa:

string? s = Console.ReadLine();

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

Implicit belépési pont metódusa

A fordító létrehoz egy metódust, amely egy legfelső szintű utasításokkal rendelkező projekt programbejegyzési pontjaként szolgál. A metódus aláírása attól függ, hogy a legfelső szintű utasítások tartalmazzák-e a await kulcsszót vagy az utasítást return . Az alábbi táblázat bemutatja, hogyan nézne ki a metódus aláírása a táblázat metódusnevével Main a kényelem érdekében.

A legfelső szintű kód tartalmazza Implicit Main aláírás
await és return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
Nem await vagy return static void Main(string[] args)

C# nyelvspecifikáció

További információkért lásd a C# nyelvi specifikációját. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.

Funkcióspecifikáció – Legfelső szintű utasítások