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 Program
Main
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 Main
olyan 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 is tartalmaz using
, először a fájlban kell szerepelniük, ahogyan az ebben a 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 await
hí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 int
tenné. 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.