10分以内でできるC#アプリケーションのコマンドライン引数
最新のC#アプリケーションを構築する際、開発者はプログラムの起動方法や動作に柔軟性が必要になることがよくあります。 すべてのオプションをハードコーディングする代わりに、起動時にユーザーがコマンドライン引数を渡せるようにすることで、アプリケーションをダイナミックにすることができます。 これにより、開発者もユーザーも同様に、コマンドラインを通じて直接入力パラメータを提供し、コードを変更することなくアプリケーションの実行方法を調整することができます。
C# Applications in Command Line Arguments in 10 Minutes or Less"と題された簡潔な10分間のチュートリアルで、ティム・コーリーは、コンソールアプリケーションとWindowsフォームアプリケーションの両方でコマンドライン引数を有効にし、効果的に処理する方法を明確に示しています。 この記事では、ティムが説明するコンセプトをステップごとに説明します。
コマンドライン引数とは何ですか?
冒頭で、ティムはコマンドライン引数がなぜ重要なのかを説明します。 彼は、Dockerのようなツールの起動方法と比較し、どのイメージを読み込むか、どのタスクを実行するかなどのコマンドを指定します。 同様に、C#のコマンドラインアプリケーションでは、実行時のプログラムの動作を定義するパラメータを渡すことができます。
たとえば、コンソールアプリを実行してファイルを処理する場合、コードを修正するのではなく、コマンドライン入力でファイルパスやモードを指定したいと思うかもしれません。
コンソールプロジェクトのセットアップ
TimはVisual Studioの中で、基本的な.NET 8コンソールアプリケーションプロジェクトから始めます。 デフォルトのコードでは、Console.ReadLine()ステートメントを使用して、ユーザーの入力を待ってから終了します。
さて、コマンドライン入力を処理するために、Timは実行時にアプリケーションに渡される引数を格納するargs配列を紹介します。 最近のC#コンソールアプリはトップレベルのステートメントを使用していますが、舞台裏ではまだ、次のように定義されたエントリポイントを持っています:
static void Main(string[] args)static void Main(string[] args)または、時には
static int Main(string[] args)static int Main(string[] args)これらのシグネチャは、メインメソッド(実行を開始するエントリポイント)を表します。 argsパラメータは、コマンドラインから供給されたすべての引数を含む文字列の配列(string[◆])である。
Tim は、foreach ループを使って args 配列を繰り返し処理しています:
foreach (var arg in args)
{
Console.WriteLine(arg);
}foreach (var arg in args)
{
Console.WriteLine(arg);
}ここで、var arg は args 配列の各文字列引数を表し、プログラムはそれらをコンソール出力の別々の行に表示します。
Timは、トップレベルのステートメントがクラスProgramやMainメソッドのような定型的なコードを隠していても、すべてが同じように動作することを指摘しています。
コンソール アプリケーションの実行
次に、Timはこの機能をテストする方法を示します。 コマンドライン入力が提供されていないため、Visual Studio内で普通にプログラムを実行しても何も変わりません。
正しくテストするために、彼は実行プロセスを手動で修正する。ファイルエクスプローラーを開き、プロジェクトのbin → Debug → net8.0フォルダに移動し、そのパスからターミナルウィンドウを起動する。
そこから、彼は次のコマンドを使う:
ConsoleArgs.exe "hello world" -t timingConsoleArgs.exe "hello world" -t timingこのコマンドは、いくつかの重要なポイントを示しています:
引用符で囲まれた "hello world "は、2つの別々の単語ではなく、1つの文字列引数として扱われます。
- フラグ-tと単語timingは、2つの追加引数として扱われます。
実行すると、コンソール出力に
hello world
-t
timinghello world
-t
timing各行の引数は、args配列の1つの要素を表します。 コンソール・アプリケーションは、実行中に渡されたすべての引数を正常に受け取り、表示しました。
開発者は、プロジェクト・ディレクトリから実行する場合、実行可能パスの代わりにdotnet runを使用することもできると述べている:
dotnet run -- "hello world" -t timingdotnet run -- "hello world" -t timingダブルダッシュ(--)は、.NET CLI自体ではなく、それ以降のすべてをプログラムのコマンドラインパラメータとして扱うように.NETに指示します。
コマンドライン引数の処理と解析
引数を読むことができるようになったので、Timはコマンドライン引数をスマートに扱う方法について説明します。
例えば、-tが値を期待するフラグである場合、プログラムは次の文字列引数を値として扱うことを知らなければなりません。 Timは、args配列のインデックスをチェックすることで、手動でこれを解析できることを示しています:
for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-t")
{
var value = args[i + 1];
Console.WriteLine($"Timing parameter: {value}");
}
}for (int i = 0; i < args.Length; i++)
{
if (args[i] == "-t")
{
var value = args[i + 1];
Console.WriteLine($"Timing parameter: {value}");
}
}このアプローチでは、名前付き引数、数値型、冗長モードのフラグまで扱うことができます。 Timは、開発者はより高度な引数解析のためにswitch文や外部のドキュメントやライブラリを使用することが多いが、System名前空間とargs配列は基本的なケースに必要なすべてをすでに提供していると指摘する。
Windowsフォームアプリケーションへの拡張
コンソールアプリのデモの後、ティムはWindowsフォームアプリケーション(WinForms)に移ります。
生成されたコードでは、Program.csファイルにstatic void Main()メソッドがありますが、まだパラメータを受け付けません。 コマンドライン引数を有効にするために、Timは手動でMainメソッドを修正し、argsパラメータを含めるようにしました:
[STAThread]
static void Main(string[] args)
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1(args.FirstOrDefault() ?? "default"));
}[STAThread]
static void Main(string[] args)
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1(args.FirstOrDefault() ?? "default"));
}彼は、args.FirstOrDefault() は args 配列から最初の入力パラメータを取得する(引数がない場合は "default" を返す)と説明しています。
次に、Form1 クラスで、Tim は文字列引数を受け付けるようにコンストラクタを更新します:
public Form1(string name)
{
InitializeComponent();
displayName.Text = name;
}public Form1(string name)
{
InitializeComponent();
displayName.Text = name;
}ここで、displayName は Windows Forms Designer で定義されたラベルで、コマンドラインから渡された引数を表示します。
引数なしでプログラムを実行すると、ラベルには "default "と表示される。を付けて再度実行すると、ラベルには "default "と表示される:
WinFormsArgs.exe "Hello World"WinFormsArgs.exe "Hello World"フォームウィンドウに "Hello World "と表示されます。
ティムは、このテクニックを使うことで、Windows Forms アプリケーションがコンソールアプリケーションのようにコマンドライン引数をサポートできるようになり、ユーザーが起動時の動作を動的に変更できるようになると説明しています。
コマンドライン引数の実用的な使用法 (7:18)
ティムは最後に、この機能によってコマンドラインツールがどれほど多機能になるかについて説明します。 開発者は、コマンドライン引数を使用して
異なるモードでアプリケーションを起動します (dark mode vs light mode など)。
ファイルパスや起動時の設定オプションを提供する。
vや--debugのような簡単なスイッチを使って、冗長モードやデバッグ機能を有効にします。
- 異なるワークフローに対して特定の引数を渡すショートカットを作成します。
文字列引数を受け付けるようにメインメソッドを設計することで、ユーザー入力ダイアログや設定ファイルを追加することなく、アプリケーションの柔軟性と適応性を簡単に拡張することができます。
おわりに (8:15)
C#でコマンドライン引数を扱うのは複雑なことではなく、どのアプリケーションにもエントリーポイント(Main)があり、そこでコマンドラインから渡された引数が文字列配列として到着することを理解すればよいのです。
コンソールアプリであろうとWindowsフォームアプリケーションであろうと、このコンセプトは、起動時に指定されたコマンド、値、パラメータにプログラムが動的に反応することを可能にします。
最終的な成果
Tim Corey の video は、C# におけるコマンドライン引数の正しい使用法について、明確で実用的なガイドを提供しています。 Mainメソッドのargsパラメータがどのように機能するかを理解することで、開発者は、より堅牢で設定可能なアプリケーションのための引数を簡単に作成、解析、使用することができます。
次にC#プロジェクトを構築するときは、コマンドライン引数は単なる技術的な構文ではなく、あなたのプログラムとユーザーをつなぐ架け橋であり、あなたのコードにさらなるパワーと柔軟性、そして実際の使いやすさを与えるものであることを覚えておいてください。

