[C#] トップレベルのステートメントを試す


はじめに



.NET 6 から、Program.cs は「最上位ステートメント」で作成されます.
今回は「最上位ステートメント」を使ってみます.

環境


  • .NET ver.6.0.101

  • デフォルトのコンソール プロジェクトで「トップレベル ステートメント」を試す



    まず、「dotnet new console」でコンソール プロジェクトを作成します.

    Program.cs



    // See https://aka.ms/new-console-template for more information
    Console.WriteLine("Hello, World!");
    

    ilspy-vscode で逆コンパイルします.
  • GitHub - icsharpcode/ilspy-vscode

  • Program.cs



    using System;
    using System.Runtime.CompilerServices;
    
    [CompilerGenerated]
    internal class Program
    {
        private static void <Main>$(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
    

    その結果、クラスとメイン メソッドが生成されました.

    「args」からコマンドライン引数を取得できます.

    Program.cs



    foreach(var a in args)
    {
        Console.WriteLine($"arcuments: {a}");    
    }
    Console.WriteLine("Hello, World!");
    

    名前空間 ?



    クラスを名前空間に入れることはできますか?いいえ.

    Program.cs



    namespace TopLevelStatementSample;
    
    // Compiling error
    Console.WriteLine("Hello, World!");
    

    Program.cs



    namespace TopLevelStatementSample
    {
        // Compiling error
        Console.WriteLine("Hello, World!");
    }
    



    error CS0116: A namespace cannot directly contain members such as fields, methods or statements
    

    もちろん、中括弧を使用して名前空間に入れることもできません.

    複数のファイル



    「最上位ステートメント」で書かれているファイルをもう 1 つ追加できますか?いいえ.

    SampleClass.cs



    // Compiling error
    void Greet(string message)
    {
        Console.WriteLine("Hello sample class");
    }
    



    error CS8802: Only one compilation unit can have top-level statements.
    

    別のメイン クラスの追加



    静的な「メイン」メソッドを持つファイルをもう 1 つ追加できますか?はい.

    SampleClass.cs



    namespace TopLevelStatementSample;
    public class SampleClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello sample class");
        }
    }
    

    しかし、警告が表示され、"SampleClass"がメイン クラスとして扱われません.

    warning CS7022: The entry point of the program is global code; ignoring 'SampleClass.Main(string[])' entry point.
    


    結果




    Hello, World!
    


    クラス、メソッド、および変数を追加する



    クラスを Program.cs に追加できます.
    しかし、ファイルの一番下にしか書き込めません.

    クラス



    Program.cs




    using TopLevelStatementSample;
    class Sample1
    {
        // can't write classes at the top of the file.
    }
    // Compiling error
    Console.WriteLine("Hello, World!");
    
    class Sample2
    {
        // can't write classes at the middle of the file.    
    }
    // Compiling error
    SampleClass.Main(new string[0]);
    
    var s3 = new Sample3();
    class Sample3
    {
        // OK.    
    }
    


    メソッドと変数



    ファイルのどこにでもメソッドと変数を書くことができます.

    Program.cs




    using TopLevelStatementSample;
    void Greet(string message)
    {
        Console.WriteLine(message);
    }
    // OK
    var message = "Hello message";
    // OK
    Greet(message);
    
    SampleClass.Main(new string[0]);
    


    それらはグローバルとして扱われるため、他のクラスもそれらを見ることができます.
    ただし、Program.cs のメソッドや変数を呼び出すことはできません.

    SampleClass.cs




    namespace TopLevelStatementSample;
    public class SampleClass
    {
        public static void Main(string[] args)
        {
            // Compiling error
            Greet("Hello sample class");
        }
    }
    



    error CS8801: Cannot use local variable or local function 'Greet' declared in a top-level statement in this context.
    


    アウトロ



    「トップレベル ステートメント」はエントリ ポイント専用であるため、「dotnet new」コマンドによってのみ作成されます.

    暗黙の処理(コマンドライン引数など)が気になりますが、慣れれば問題はなくなると思います.

    資力


  • Top-level statements - C# 9.0 feature specifications | Microsoft Docs
  • エントリー ポイント - C# によるプログラミング入門 | ++C++; // 未確認飛行 C