Sdílet prostřednictvím


Main() a argumenty příkazového řádku

Návod

Začínáte s vývojem softwaru? Začněte nejprve kurzy Začínáme . Tyto kurzy používají příkazy nejvyšší úrovně, což je pro nové aplikace jednodušší.

Pracujete s existujícím základem kódu? Mnoho existujících aplikací používá explicitní Main metodu. Tento článek vysvětluje, jak funguje a jak ho efektivně používat.

Když spustíte aplikaci jazyka C#, modul runtime volá metodu Main . Metoda Main je vstupním bodem aplikace jazyka C#.

Program jazyka C# může mít pouze jeden vstupní bod. Pokud máte více než jednu třídu s metodou Main , musíte při kompilaci programu použít možnost kompilátoru StartupObject určit, která Main metoda slouží jako vstupní bod. Další informace naleznete v tématu StartupObject (možnosti kompilátoru jazyka C#). Následující příklad zobrazí počet argumentů příkazového řádku jako první akci:

class TestClass
{
    static void Main(string[] args)
    {
        Console.WriteLine(args.Length);
    }
}

Přehled

Metoda Main je vstupním bodem spustitelného programu. Při spuštění programu modul runtime volá Main před provedením jakéhokoli jiného kódu. Když se Main vrátí, program skončí. Deklarujete Main pomocí těchto pravidel:

  • Musíte deklarovat Main uvnitř třídy nebo struktury. Uzavření class může být static.
  • Main musí být static.
  • Main může mít libovolný modifikátor přístupu.
  • Mainmůže vrátit void, , intTasknebo Task<int>.
  • Pokud a pouze pokud Main vrátí Task nebo Task<int>, může deklarace Main zahrnovat modifikátor async. Toto pravidlo výslovně vylučuje metodu async void Main .
  • Metodu Main můžete deklarovat pomocí nebo bez parametru string[] , který obsahuje argumenty příkazového řádku. Pokud k vytváření aplikací pro Windows používáte Visual Studio, můžete parametr přidat ručně nebo použít metodu GetCommandLineArgs() k získání argumentů příkazového řádku. Parametry jsou argumenty příkazového řádku indexované nulou. Na rozdíl od jazyka C a C++ není název programu považován za první argument příkazového řádku v args poli, ale je to první prvek GetCommandLineArgs() metody.

Následující seznam ukazuje permutace deklarací Main :

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í. Můžete zadat libovolný modifikátor explicitního přístupu.

Následující tabulka shrnuje všechny platné Main podpisy a kdy je použít:

Main prohlášení Používá args Obsahuje await Vrátí ukončovací kód.
static void Main() Ne Ne Ne
static int Main() Ne Ne Ano
static void Main(string[] args) Ano Ne Ne
static int Main(string[] args) Ano Ne Ano
static async Task Main() Ne Ano Ne
static async Task<int> Main() Ne Ano Ano
static async Task Main(string[] args) Ano Ano Ne
static async Task<int> Main(string[] args) Ano Ano Ano

Zvolte nejjednodušší podpis, který vyhovuje vašim potřebám. Pokud nepotřebujete argumenty příkazového řádku, parametr vynecháte string[] args . Pokud nepotřebujete vracet ukončovací kód, použijte void nebo Task. Pokud potřebujete volat asynchronní metody, použijte async s typem Task nebo návratovým typem Task<int>.

Návratové hodnoty Main()

Po návratu int nebo Task<int>může program odesílat informace o stavu jiným programům nebo skriptům, které spustitelný soubor spouští. Návratová 0 hodnota obvykle znamená úspěch a nenulová hodnota znamená, že došlo k chybě.

Následující příklad vrátí ukončovací kód:

class MainReturnValTest
{
    static int Main()
    {
        //...
        return 0;
    }
}

Po spuštění programu můžete zkontrolovat ukončovací kód. V PowerShellu použijte $LastExitCode. V dávkovém souboru nebo skriptu shellu použijte %ERRORLEVEL%.

Pokud vaše Main metoda používá await, deklarujte ji jako async s návratovým typem Task nebo Task<int>. Modul runtime volá Main a čeká na dokončení vráceného Task před ukončením procesu. Návratový typ nemůže být void nebo int protože async modifikátor vyžaduje návratový typ, který může modul runtime očekávat–void a int nepředstavuje probíhající práci, takže proces může před dokončením asynchronních operací ukončit. Použijte Task , když nepotřebujete ukončovací kód nebo Task<int> když:

class Program
{
    static async Task<int> Main(string[] args)
    {
        return await AsyncConsoleWork();
    }

    private static async Task<int> AsyncConsoleWork()
    {
        return 0;
    }
}

Argumenty příkazového řádku

string[] args Do deklarace zahrňte Main parametr, který bude přijímat argumenty příkazového řádku. Pokud je nepotřebujete, parametr vynecháte. Parametr args je String pole, které nemá hodnotu null – pokud nejsou zadané žádné argumenty, je to Length nula.

Řetězcové argumenty můžete převést na jiné typy pomocí:ParseConvert

long num = long.Parse(args[0]);

Návod

Analýza argumentů příkazového řádku může být složitá. Zvažte použití knihovny System.CommandLine ke zjednodušení procesu.

Pracovní příklad najdete v tématu Zobrazení argumentů příkazového řádku.

specifikace jazyka C#

Další informace najdete ve specifikaci jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.