次の方法で共有


Main() とコマンド ライン引数

ヒント

ソフトウェアの開発は初めてですか? 最初に、 作業の開始 に関するチュートリアルから始めます。 これらのチュートリアルでは、新しいアプリの方が簡単な 最上位レベルのステートメントを使用します。

既存のコードベースを使用していますか? 多くの既存のアプリケーションでは、明示的な Main メソッドが使用されています。 この記事では、そのしくみと効果的な使用方法について説明します。

C# アプリケーションを起動すると、ランタイムは Main メソッドを呼び出します。 Main メソッドは、C# アプリケーションのエントリ ポイントです

C# プログラムはエントリ ポイントを 1 つだけ持つことができます。 Main メソッドを持つ複数のクラスがある場合は、プログラムをコンパイルするときに StartupObject コンパイラ オプションを使用して、エントリ ポイントとして機能するMain メソッドを指定する必要があります。 詳細については、「StartupObject (C# コンパイラ オプション)」を参照してください。 次の例では、最初のアクションとしてコマンド ライン引数の数を表示します。

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

概要

Main メソッドは、実行可能プログラムのエントリ ポイントです。 プログラムが起動すると、ランタイムは他のコードが実行される前に Main を呼び出します。 Mainが戻ると、プログラムは終了します。 Mainは、次の規則で宣言します。

  • クラスまたは構造体内で Main を宣言する必要があります。 外側の classstatic でもかまいません。
  • Main は、static である必要があります。
  • Main は、任意の アクセス修飾子を持つことができます。
  • Main は、 voidintTask、または Task<int>を返すことができます。
  • MainTaskまたはTask<int>を返す場合にのみ、Mainの宣言にasync修飾子を含めることができます。 この規則では、 async void Main メソッドは特に除外されます。
  • Main メソッドは、コマンド ライン引数を含むstring[] パラメーターを使用して、または指定せずに宣言できます。 Visual Studio を使用して Windows アプリケーションを作成する場合は、パラメーターを手動で追加するか、 GetCommandLineArgs() メソッドを使用してコマンド ライン引数を取得できます。 パラメーターは、インデックスが 0 のコマンド ライン引数です。 C および C++ とは異なり、プログラムの名前は args 配列の最初のコマンド ライン引数として扱われませんが、 GetCommandLineArgs() メソッドの最初の要素です。

次の一覧は、 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) { }

上記の例ではアクセス修飾子を指定していないため、既定で暗黙的に private に設定されます。 明示的なアクセス修飾子を指定できます。

次の表は、有効なすべての Main 署名と、それぞれを使用するタイミングをまとめたものです。

Main 宣言 用途 args 含む await 終了コードを返します。
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) はい はい はい

ニーズに合った最もシンプルな署名を選択します。 コマンド ライン引数が必要ない場合は、 string[] args パラメーターを省略します。 終了コードを返す必要がない場合は、 void または Taskを使用します。 非同期メソッドを呼び出す必要がある場合は、asyncまたは戻り値の型でTaskTask<int>使用します。

Main() の戻り値

intまたはTask<int>を返すと、プログラムは実行可能ファイルを実行する他のプログラムまたはスクリプトに状態情報を送信できます。 0の戻り値は通常成功を意味し、0 以外の値はエラーがあることを意味します。

次の例では、終了コードが返されます。

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

プログラムを実行した後、終了コードを確認できます。 PowerShell では、 $LastExitCodeを使用します。 バッチ ファイルまたはシェル スクリプトでは、 %ERRORLEVEL%を使用します。

Main メソッドで await を使用する場合は、戻り値の型として asyncTask、または Task<int> を宣言してください。 ランタイムは Main を呼び出し、返された Task が完了するまで待機してからプロセスが終了します。 戻り値の型を void または int することはできません。 async 修飾子には、ランタイムが待機できる戻り値の型が必要であり、voidint は進行中の作業を表していないため、非同期操作が完了する前にプロセスが終了する可能性があります。 終了コードが不要な場合は Task を使用するか、次の場合に Task<int> します。

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

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

コマンドライン引数

string[] args宣言に Main パラメーターを含め、コマンドライン引数を受け入れます。 必要ない場合は、パラメーターを省略します。 args パラメーターはString、決して null ではない配列です。引数が指定されていない場合、そのLengthは 0 になります。

ParseまたはConvertを使用して、文字列引数を他の型に変換できます。

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

ヒント

コマンド ライン引数の解析は複雑になることがあります。 System.CommandLine ライブラリを使用してプロセスを簡略化することを検討してください。

作業例については、「 コマンドライン引数を表示する方法」を参照してください。

C# 言語仕様

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。