C# コンソール アプリ テンプレートによって最上位レベルのステートメントが生成される

.NET 6 からは、新しい C# コンソール アプリ用のプロジェクト テンプレートによって、Program.cs ファイルに次のコードが生成されます。

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

この新しい出力では、プログラムに記述する必要があるコードを簡素化できる最新の C# 機能が使用されています。 .NET 5 およびそれより前のバージョンの場合は、コンソール アプリ テンプレートによって次のコードが生成されます。

using System;

namespace MyApp // Note: actual namespace depends on the project name.
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

この 2 つの形式は、同じプログラムを表しています。 どちらも C# 10.0 で有効です。 新しいバージョンで使用する場合、記述する必要があるのは、`Main` メソッドの本体のみです。 コンパイラにより、Program クラスが Main メソッドと合成され、すべての最上位レベルのステートメントがその Main メソッドに配置されます。 他のプログラム要素はコンパイラによって生成されるため、含める必要はありません。 最上位レベルのステートメントを使用するときにコンパイラによって生成されるコードについては、C# ガイドの基礎セクションにある、最上位レベルのステートメントに関する記事で詳しく説明されています。

.NET 6 以上のテンプレートを使用するように更新されていないチュートリアルを使用するには、次の 2 つのオプションがあります。

  • 新しいプログラム スタイルを使用し、機能を追加する場合は、新しい最上位レベルのステートメントを追加します。
  • `Program` クラスと `Main` メソッドを使用して、新しいプログラム スタイルを古いスタイルに変換します。

以前のテンプレートを使用したい場合は、この記事で後に出てくる「以前のプログラム スタイルを使用する」セクションを参照してください。

新しいプログラム スタイルを使用する

新しいプログラムをより簡単にするのが、"最上位レベルのステートメント"、"グローバルの using ディレクティブ、"暗黙的な using ディレクティブ" の機能です。

"最上位レベルのステートメント" という言葉は、コンパイラによって、メイン プログラムのクラスおよびメソッド要素が生成されることを意味します。 コンパイラによって生成されたクラスと Main メソッドは、グローバル名前空間で宣言されます。 新しいアプリケーションのコードを確認すると、以前のテンプレートによって生成された Main メソッド内にステートメントが含まれていることがわかります (ただし、グローバル空間内で)。

従来のスタイルで `Main` メソッドにステートメントを追加できるのと同じように、プログラムにステートメントを追加できます。 args (コマンドライン引数) にアクセスしawait を使用し終了コードを設定することができます。 関数を追加することもできます。 これらは、生成された `Main` メソッド内で入れ子になったローカル関数として作成されます。 ローカル関数にアクセス修飾子 (たとえば、publicprotected) を含めることはできません。

最上位レベルのステートメントと[暗黙的な `using` ディレクティブ](#implicit-using-directives)の両方で、アプリケーションを構成するコードが簡略化されます。 既存のチュートリアルに従う場合は、テンプレートによって生成される Program.cs ファイルに新しいステートメントを追加します。 チュートリアルの説明で、ステートメントを `Main` メソッド内の始め中かっこと終わり中かっこの間に記述することがわかります。

古い形式を使用したい場合は、この記事の 2 番目の例のコードをコピーし、前と同様にチュートリアルを続行できます。

最上位レベルのステートメントの詳細については、[最上位レベルのステートメント]

暗黙的な `using` ディレクティブ

"暗黙的な using ディレクティブ" という言葉は、コンパイラによって、プロジェクト タイプに基づいて一連の using ディレクティブが自動的に追加されることを意味します。 コンソール アプリケーションの場合、次のディレクティブが、アプリケーションに暗黙的に含まれます。

  • using System;
  • using System.IO;
  • using System.Collections.Generic;
  • using System.Linq;
  • using System.Net.Http;
  • using System.Threading;
  • using System.Threading.Tasks;

その他のアプリケーションの種類には、それらのアプリケーションの種類でよく使われるものより多くの名前空間が含まれます。

暗黙的に含まれていない using ディレクティブが必要な場合は、それらを最上位レベルのステートメントが含まれる .cs ファイルに追加するか、その他の .cs ファイルに追加できます。 アプリケーション内のすべての .cs ファイルに必要な using ディレクティブに対して、グローバル using ディレクティブ を使用します。

暗黙的な using ディレクティブを無効にする

この動作を削除し、プロジェクトの全名前空間を手動で制御する場合、次の例のように、<PropertyGroup> 要素でプロジェクト ファイルに <ImplicitUsings>disable</ImplicitUsings> を追加します。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    ...
    <ImplicitUsings>disable</ImplicitUsings>
  </PropertyGroup>

</Project>

グローバル `using` ディレクティブ

"グローバル using ディレクティブ" では、1 つのファイルではなくアプリケーション全体に対して名前空間がインポートされます。 このようなグローバル ディレクティブを追加するには、プロジェクト ファイルに <Using> 項目を追加するか、コード ファイルに global using ディレクティブを追加します。

また、Remove 属性を持つ <Using> 項目をプロジェクト ファイルに追加し、特定の暗黙的な using ディレクティブを削除することもできます。 たとえば、<ImplicitUsings>enable</ImplicitUsings> で暗黙的な using 機能が有効になっている場合、次の <Using> 項目を追加すると、暗黙的にインポートされる名前空間から System.Net.Http 名前空間が削除されます。

<ItemGroup>
  <Using Remove="System.Net.Http" />
</ItemGroup>

以前のプログラム スタイルを使用する

.NET SDK 6.0.300 以降では、 console テンプレートにはオプションがあります --use-program-main 。 これを使用して、最上位レベルのステートメントを使用せず、メソッドを持つコンソール プロジェクトを Main 作成します。

dotnet new console --use-program-main

生成される Program.cs は次のとおりです。

namespace MyProject;
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello, World!");
    }
}

Visual Studio で以前のプログラム スタイルを使用する

  1. 新しいプロジェクトを作成すると、セットアップ手順によって [追加情報] のセットアップ ページに移動します。 このページで、[ 最上位レベルのステートメントを使用しない ] チェック ボックスをオンにします。

    Visual Studio で最上位レベルのステートメントを使用しない] チェック ボックス

  2. プロジェクトが作成されると、 Program.cs コンテンツは次のようになります。

    namespace MyProject;
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
    

Note

Visual Studio では、同じテンプレートに基づいてプロジェクトを次回作成するときにオプションの値が保持されます。そのため、コンソール アプリ プロジェクトを作成するときに既定で、次回 [最上位レベルのステートメントを使用しない] チェック ボックスがオンになります。 ファイルの Program.cs 内容は、Visual Studio のグローバル テキスト エディター設定またはファイルで定義されているコード スタイルと EditorConfig 一致するように異なる場合があります。

詳細については、「EditorConfig と Options、Text Editor、C#、Advancedを使用して移植可能なカスタム エディター設定を作成する」を参照してください。

テンプレートのフィードバック

最上位レベルのステートメント は.NET 6 で導入されました。 GitHub イシュー #27420 で賛成または反対の票を投じて、プロジェクト テンプレートでのこの機能の使用を支持するかどうかをお知らせください。