🗿

.NET 6 Top-level statements

2021/11/21に公開
2

Top-level statements

御指摘をいただきました。Top-level statementsは、.NET 6から対応した、と記述してしまったのですが、.NET 5から対応しており、すでに利用可能でした。.NET 6からは、Project新規作成時のテンプレートにTop-level statementsが実装された、が正しいです。以下、内容を修正しました。


.NET 5からはエントリポイント(プログラムの開始場所)を、クラス宣言せずにグローバル部分(namespace宣言の外)に記述できるようになり、簡略化することができるようになった。この記述部分をTop-level statements(最上位レベルのステートメント)と言う。これはつまり、Script言語(javaScript,Python)のようにクラスを定義しなくても使用することができるようになったということである。この機能はシンプルな(クラス構造が不必要な)プログラムを書く時に便利である。この機能は、.NET 6 からは新規作成時のProjectに実装されるようになった。

.NET 5 以降 -> 以下の記述だけで実行可能となった。class宣言もnamespace宣言も無くてよい。namespaceの外に記述すればそこがエントリポイントとして解釈される。

Console.WriteLine("Hello World!");

.NET 5 より前 -> クラス宣言とMain関数の記述が必要

using System;

class TestClass
{
    static void Main(string[] args)
    {
        // Display the number of command line arguments.
        Console.WriteLine("Hello World!");
    }
}

Version対応

.NET 5 から対応しているので、VisualStudio2019 C# 9や、VisualStudio 2022 C# 10にて記述可能である。

Target Framework C# Visual Studio Top-level statements 対応
.NET 6.x C# 10 2022
.NET 5.x C# 9 2019
.NET 5 より前 C# 8 2019

注意点

Top-level statementsは原則1カ所のみ

Top-level statements を2カ所に分けて書くとエラーとなる。一つの実行ファイルに一つのみが原則である。

次のコードは、Top-level statements を2カ所に分けて記述しているので、コンパイルエラーとなる。同様に、別ファイルに分けて記述してもエラーとなる。

using HelloWorld;

////////////////////////////////
//Top-level statements を記述 //
////////////////////////////////
Console.WriteLine("TopLevelStatement 1");
new Sample();

////////////////
//Main Method //
////////////////
namespace HelloWorld
{
    internal class Sample
    {
        public Sample()
        {
            Console.WriteLine("Hello World");
        }
    }
}

////////////////////////////////////////////
//Top-level statements をもう一度記述する  //
////////////////////////////////////////////
Console.WriteLine("TopLevelStatement 2");

エラーが出る

Error	CS8803	Top-level statements must precede namespace and type declarations.
Top-level statementsとMain関数を両方記述すると、Main関数が無視される

以下はコンパイルエラーとはならず、警告が表示され、Main関数が無視される。

////////////////////////////////
//Top-level statements を記述 //
////////////////////////////////
Console.WriteLine("TopLevelStatement 1");

////////////////
//Main Method //
////////////////
namespace HelloWorld
{
    internal class Sample
    {
        private static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

実行結果

TopLevelStatement 1

警告が出る

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

以上

Discussion

Mayuki SawatariMayuki Sawatari

Top-level statements は C# 9 の機能ですので .NET 5 / Visual Studio 2019 から対応しています。
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9#top-level-statements

.NET 6 からは global using の導入と .NET 6 プロジェクトでのデフォルト有効化によって using の省略が可能となりました。