Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Metoda Main
je vstupním bodem aplikace jazyka C#. Při spuštění Main
aplikace je metoda první metodou, která je vyvolána.
V programu jazyka C# může být pouze jeden vstupní bod. Pokud máte více než jednu třídu, která má metodu Main
, musíte zkompilovat program s možností StartupObject kompilátoru určit, kterou Main
metodu použít jako vstupní bod. Další informace naleznete v tématu StartupObject (možnosti kompilátoru jazyka C#).
Níže je příklad, kde první řádek spuštěný zobrazí počet argumentů příkazového řádku:
class TestClass
{
static void Main(string[] args)
{
Console.WriteLine(args.Length);
}
}
Příkazy nejvyšší úrovně můžete také použít v jednom souboru jako vstupní bod pro vaši aplikaci.
Stejně jako metoda Main
můžou příkazy nejvyšší úrovně také vracet hodnoty a mít přístup k argumentům příkazového řádku.
Další informace najdete v tématu Příkazy nejvyšší úrovně.
Následující příklad používá smyčku foreach
k zobrazení argumentů příkazového řádku pomocí proměnné args
a na konci programu vrátí kód úspěchu (0
):
using System.Text;
StringBuilder builder = new();
builder.AppendLine("The following arguments are passed:");
foreach (var arg in args)
{
builder.AppendLine($"Argument={arg}");
}
Console.WriteLine(builder.ToString());
return 0;
Přehled
- Metoda
Main
je vstupním bodem spustitelného programu; je místem, kde se spouští a končí ovládací prvek programu. -
Main
musí být deklarována uvnitř třídy nebo struktury. Uzavřeníclass
může býtstatic
. -
Main
musí býtstatic
. -
Main
může mít jakýkoli modifikátor přístupu (s výjimkoufile
). -
Main
může mít buď typvoid
,int
,Task
neboTask<int>
návratový typ. - Jen tehdy, když
Main
vrátíTask
neboTask<int>
, deklaraceMain
může zahrnovat modifikátorasync
. Tím se konkrétně vyloučíasync void Main
metoda. - Metodu
Main
lze deklarovat pomocí nebo bez parametru, který obsahuje argumenty příkazovéhostring[]
řádku. Při vytváření aplikací pro Windows pomocí sady Visual Studio můžete parametr přidat ručně nebo použít metodu GetCommandLineArgs() k získání argumentů příkazového řádku. Parametry se čtou jako argumenty příkazového řádku s nulovým indexem. Na rozdíl od jazyka C a C++ není název programu považován za první argument příkazového řádku vargs
poli, ale jedná se o první prvek GetCommandLineArgs() metody.
V následujícím seznamu jsou uvedeny nejběžnější Main
deklarace:
static void Main() { }
static int Main() { }
static void Main(string[] args) { }
static int Main(string[] args) { }
static async Task Main() { }
static async Task<int> Main() { }
static async Task Main(string[] args) { }
static async Task<int> Main(string[] args) { }
Předchozí příklady nezadávají modifikátor přístupu, takže jsou implicitně private
ve výchozím nastavení. To je typické, ale je možné zadat jakýkoli explicitní modifikátor přístupu.
Návod
Přidání async
a Task
a jejich návratové typy zjednodušují programový kód, když je třeba spustit konzolové aplikace a Task<int>
asynchronní operace v await
.
Návratové hodnoty Main()
V metodě int
můžete vrátit Main
definováním metody některým z následujících způsobů:
Main prohlášení |
Main kód metody |
---|---|
static int Main() |
Žádné použití args nebo await |
static int Main(string[] args) |
Použití args , bez použití await |
static async Task<int> Main() |
Žádné použití args , používá se await |
static async Task<int> Main(string[] args) |
Používá args a await |
Pokud vrácená hodnota z Main
není použita, vrácení void
nebo Task
umožňuje mírně jednodušší kód.
Main prohlášení |
Main kód metody |
---|---|
static void Main() |
Žádné použití args nebo await |
static void Main(string[] args) |
Použití args , bez použití await |
static async Task Main() |
Žádné použití args , používá se await |
static async Task Main(string[] args) |
Používá args a await |
Vrácení int
nebo Task<int>
však umožňuje programu sdělit informace o stavu jiným programům nebo skriptům, které vyvolávají spustitelný soubor.
Následující příklad ukazuje, jak lze získat přístup k ukončovacímu kódu procesu.
V tomto příkladu se používají nástroje příkazového řádku .NET Core . Pokud neznáte nástroje příkazového řádku .NET Core, můžete se o nich dozvědět v tomto úvodním článku.
Vytvořte novou aplikaci spuštěním dotnet new console
příkazu . Upravte metodu Main
v Program.cs následujícím způsobem:
class MainReturnValTest
{
static int Main()
{
//...
return 0;
}
}
Nezapomeňte tento program uložit jako MainReturnValTest.cs.
Při spuštění programu ve Windows se jakákoli hodnota vrácená z Main
funkce uloží do proměnné prostředí. Tuto proměnnou prostředí je možné načíst pomocí ERRORLEVEL
dávkového souboru nebo $LastExitCode
z PowerShellu.
Aplikaci můžete sestavit pomocí příkazu dotnet CLIdotnet build
.
Dále vytvořte skript PowerShellu pro spuštění aplikace a zobrazte výsledek. Vložte následující kód do textového souboru a uložte ho jako test.ps1
do složky, která obsahuje projekt. Spusťte skript PowerShellu zadáním test.ps1
na příkazovém řádku PowerShellu.
Protože kód vrátí nulu, dávkový soubor ohlásí úspěch. Pokud ale změníte MainReturnValTest.cs tak, aby vracel nenulovou hodnotu, a pak znovu zkompilujete program, následné spuštění skriptu PowerShell oznámí selhání.
dotnet run
if ($LastExitCode -eq 0) {
Write-Host "Execution succeeded"
} else
{
Write-Host "Execution Failed"
}
Write-Host "Return value = " $LastExitCode
Execution succeeded
Return value = 0
Asynchronní hlavní návratové hodnoty
Když deklarujete návratovou async
hodnotu pro Main
, kompilátor vygeneruje základní kód pro volání asynchronních metod v Main
. Pokud nezadáte async
klíčové slovo, musíte tento kód napsat sami, jak je znázorněno v následujícím příkladu. Kód v příkladu zajistí, že se program spustí, dokud se nedokončila asynchronní operace:
class AsyncMainReturnValTest
{
public static int Main()
{
return AsyncConsoleWork().GetAwaiter().GetResult();
}
private static async Task<int> AsyncConsoleWork()
{
return 0;
}
}
Tento často používaný kód lze nahradit:
class Program
{
static async Task<int> Main(string[] args)
{
return await AsyncConsoleWork();
}
private static async Task<int> AsyncConsoleWork()
{
return 0;
}
}
V obou příkladech se hlavní část programu nachází v těle metody AsyncConsoleWork()
.
Výhodou deklarování Main
jako async
je, že kompilátor vždy generuje správný kód.
Když vstupní bod aplikace vrátí nebo Task
Task<int>
, kompilátor vygeneruje nový vstupní bod, který volá metodu vstupního bodu deklarovanou v kódu aplikace. Za předpokladu, že se tento vstupní bod nazývá $GeneratedMain
, kompilátor vygeneruje následující kód pro tyto vstupní body:
-
static Task Main()
má za následek, že kompilátor emituje ekvivalentprivate static void $GeneratedMain() => Main().GetAwaiter().GetResult();
-
static Task Main(string[])
má za následek, že kompilátor emituje ekvivalentprivate static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();
-
static Task<int> Main()
má za následek, že kompilátor emituje ekvivalentprivate static int $GeneratedMain() => Main().GetAwaiter().GetResult();
-
static Task<int> Main(string[])
má za následek, že kompilátor emituje ekvivalentprivate static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();
Poznámka:
Pokud se v metodě použil async
modifikátor Main
příkladů, kompilátor by vygeneroval stejný kód.
Argumenty příkazového řádku
Argumenty metody Main
můžete odeslat definováním metody jedním z následujících způsobů:
Main prohlášení |
Main kód metody |
---|---|
static void Main(string[] args) |
Žádná návratová hodnota, nepoužívá se await |
static int Main(string[] args) |
Návratová hodnota, bez použití await |
static async Task Main(string[] args) |
Neposkytuje návratovou hodnotu, používá await |
static async Task<int> Main(string[] args) |
Návratová hodnota, použití await |
Pokud se argumenty nepoužívají, můžete z deklarace metody vynechat args
trochu jednodušší kód:
Main prohlášení |
Main kód metody |
---|---|
static void Main() |
Žádná návratová hodnota, nepoužívá se await |
static int Main() |
Návratová hodnota, bez použití await |
static async Task Main() |
Neposkytuje návratovou hodnotu, používá await |
static async Task<int> Main() |
Návratová hodnota, použití await |
Poznámka:
Můžete také použít Environment.CommandLine nebo Environment.GetCommandLineArgs, abyste přistupovali k argumentům příkazového řádku z libovolného bodu konzolové nebo Windows Forms aplikace. Chcete-li povolit argumenty příkazového řádku v Main
deklaraci metody v aplikaci model Windows Forms, je nutné ručně upravit deklaraci Main
. Kód vygenerovaný návrhářem Windows Forms vytvoří Main
bez vstupního parametru.
Parametr Main
metody je String pole, které představuje argumenty příkazového řádku. Obvykle určíte, zda argumenty existují testováním Length
vlastnosti, například:
if (args.Length == 0)
{
System.Console.WriteLine("Please enter a numeric argument.");
return 1;
}
Návod
Pole args
nemůže mít hodnotu null. Je tedy bezpečné přistupovat k Length
vlastnosti bez kontroly null.
Řetězcové argumenty můžete také převést na číselné typy pomocí Convert třídy nebo Parse
metody. Například následující příkaz převede string
na číslo long
pomocí metody Parse:
long num = Int64.Parse(args[0]);
Je také možné použít typ long
jazyka C#, který slouží jako alias pro Int64
.
long num = long.Parse(args[0]);
Stejnou věc můžete provést také pomocí Convert
metody ToInt64
třídy:
long num = Convert.ToInt64(s);
Další informace najdete v tématech Parse a Convert.
Návod
Analýza argumentů příkazového řádku může být složitá. Pokud chcete proces zjednodušit, zvažte použití knihovny System.CommandLine (aktuálně v beta verzi).
Následující příklad ukazuje, jak používat argumenty příkazového řádku v konzolové aplikaci. Aplikace vezme jeden argument za běhu, převede argument na celé číslo a vypočítá faktoriál čísla. Pokud nejsou zadány žádné argumenty, aplikace vydá zprávu, která vysvětluje správné použití programu.
Pokud chcete aplikaci zkompilovat a spustit z příkazového řádku, postupujte takto:
Do libovolného textového editoru vložte následující kód a uložte ho jako textový soubor s názvem Factorial.cs.
public class Functions { public static long Factorial(int n) { // Test for invalid input. if ((n < 0) || (n > 20)) { return -1; } // Calculate the factorial iteratively rather than recursively. long tempResult = 1; for (int i = 1; i <= n; i++) { tempResult *= i; } return tempResult; } } class MainClass { static int Main(string[] args) { if (args.Length == 0) { Console.WriteLine("Please enter a numeric argument."); Console.WriteLine("Usage: Factorial <num>"); return 1; } int num; bool test = int.TryParse(args[0], out num); if (!test) { Console.WriteLine("Please enter a numeric argument."); Console.WriteLine("Usage: Factorial <num>"); return 1; } long result = Functions.Factorial(num); if (result == -1) Console.WriteLine("Input must be >= 0 and <= 20."); else Console.WriteLine($"The Factorial of {num} is {result}."); return 0; } }
Na začátku metody
Main
program testuje, zda nebyly poskytnuty vstupní argumenty, tím že porovnává délku argumentuargs
s0
. Pokud nejsou nalezeny žádné argumenty, zobrazí nápovědu.
Pokud jsou zadány argumenty (args.Length
je větší než 0), program se pokusí převést vstupní argumenty na čísla. Pokud argument není číslo, vyvolá se výjimka.
Po výpočtu faktoriálu (uloženého vresult
proměnné typulong
) se podrobný výsledek vytiskne v závislosti na proměnnéresult
.V nabídce Start nebo Start otevřete okno příkazového řádku pro vývojáře sady Visual Studio a přejděte do složky, která obsahuje soubor, který jste vytvořili.
Zadáním následujícího příkazu aplikaci zkompilujte.
dotnet build
Pokud vaše aplikace neobsahuje žádné chyby kompilace, vytvoří se spustitelný soubor s názvem Factorial.exe .
Zadejte následující příkaz pro výpočet faktoriálu 3:
dotnet run -- 3
Pokud jako argument programu zadáte hodnotu 3, výstup se přečte:
The factorial of 3 is 6.
Poznámka:
Při spuštění aplikace v sadě Visual Studio můžete zadat argumenty příkazového řádku na stránce Ladění, Návrhář projektu.
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#.