自分のC#の知識が古いバージョンで止まっているので、新しい仕様をキャッチアップしていく。
C# 9以前では、C#プログラムのエントリポイントを以下のように記述する必要があった。
using System; class TestClass { static void Main(string[] args) { // Display the number of command line arguments. Console.WriteLine(args.Length); } }
C# 9以降では、以下のようにMainメソッドを省略し、Mainメソッド内にあるかのようにC#ステートメントを記述することができる。これを最上位のステートメントと呼ぶらしい。
using System.Text; StringBuilder builder = new(); builder.AppendLine("Hello"); builder.AppendLine("World!"); Console.WriteLine(builder.ToString());
以下、留意点。
最上位レベルのファイルは1つだけ
アプリケーションに含めるエントリポイントは1つだけなので、プロジェクト内には最上位のステートメントを含むファイルは1つだけにすること。複数存在するとコンパイルエラーになる。
エントリポイントは他に用意しない
最上位レベルのステートメントとMainメソッドを混在させないこと。混在させるとコンパイルエラーになる。
usingディレクティブ
以下のようにファイルの先頭に指定する。
using System.Text; StringBuilder builder = new(); builder.AppendLine("Hello"); builder.AppendLine("World!"); Console.WriteLine(builder.ToString());
グローバル名前空間
最上位レベルのステートメントは暗黙的にグローバル名前空間に属する。
コマンドライン引数 (args)
コマンドライン引数が入力された場合、args 変数を参照してそれにアクセスできる。
if (args.Length > 0) { foreach (var arg in args) { Console.WriteLine($"Argument={arg}"); } } else { Console.WriteLine("No arguments"); }
await
await を使用して非同期メソッドを呼び出すことができる。
プロセスの終了コード
アプリケーションの終了時に int 値を返すには、int を返す Main メソッドの場合と同じように、return ステートメントを使用する。
string? s = Console.ReadLine(); int returnValue = int.Parse(s ?? "-1"); return returnValue;
参考ページ
最上位レベルのステートメント – Main メソッドを使用しないプログラム | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/program-structure/top-level-statements