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 ではありません。コードで直接参照できない実装の詳細です。 他のプログラム要素はコンパイラによって生成されるため、含める必要はありません。 最上位レベルのステートメントを使用するときにコンパイラによって生成されるコードについては、C# ガイドの基礎セクションにある、最上位レベルのステートメントに関する記事で詳しく説明されています。

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

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

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

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

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

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

従来のスタイルで `Main` メソッドにステートメントを追加できるのと同じように、プログラムにステートメントを追加できます。 args (コマンドライン引数) にアクセスしawait を使用し終了コードを設定することができます。 関数を追加することもできます。 これらは、生成されたエントリ ポイント メソッド内で入れ子になったローカル関数として作成されます。 ローカル関数にアクセス修飾子 (たとえば、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 do not use top-level statements check box

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

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

注意

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

詳細については「EditorConfig で移植可能なカスタム エディター設定を作成する」および「[オプション]、[テキスト エディター]、[C#]、[詳細]」を参照してください。