新しい C# テンプレートで、最上位レベルのステートメントが生成される

.NET 6 以降、console テンプレートを使用した新しいプロジェクトからは、以前のバージョンとは異なるコードが生成されます。

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

この新しい出力では、プログラムに記述する必要があるコードを簡素化できる最新の C# 機能が使用されています。 従来は、コンソール アプリ テンプレートによって次のコードが生成されていました。

using System;
using System.Collections.Generic;
using System.Linq;

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

この 2 つの形式は、同じプログラムを表しています。 どちらも C# 10.0 で有効です。 新しいバージョンで使用する場合、記述する必要があるのは、Main メソッドの本体のみです。 他のプログラム要素を含める必要はありません。 既存のチュートリアルを使用するには、次の 2 つのオプションがあります。

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

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

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

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

最上位レベルのステートメントとは、コンパイラによって、メイン プログラムの名前空間、クラス、およびメソッド要素が生成されることを意味します。 新しいアプリケーションのコードを確認すると、以前のテンプレートによって生成された Main メソッド内にステートメントが含まれていることがわかります。 従来のスタイルで Main メソッドにステートメントを追加できるのと同じように、プログラムにステートメントを追加できます。 関数を追加することもできます。 これらは、生成された Main メソッド内で入れ子になったローカル関数として作成されます。

最上位レベルのステートメントと暗黙的な using ディレクティブの両方で、アプリケーションを構成するコードが簡略化されます。 既存のチュートリアルに従う場合は、テンプレートによって生成される 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 ステートメントを無効にする

この動作を削除し、プロジェクト内のすべての名前空間を手動で制御する場合は、プロジェクト ファイルに <ImplicitUsings>disable</ImplicitUsings> を追加します。

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

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

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

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

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

.NET 6 コンソール アプリ テンプレートでは最上位レベルのステートメント プログラムの新しいスタイルが生成されますが、.NET 5 を使用した場合は違います。 .NET 5 プロジェクトを作成すると、古いスタイルのプログラムを受信します。 この場合、プロジェクト ファイルを編集して .NET 6 をターゲットにすることができます。

重要

.NET 5 をターゲットとするプロジェクトを作成するには、.NET 5 テンプレートが必要です。 .NET 5 テンプレートは、dotnet new --install コマンドを使用して手動で、または.NET 5 SDK をインストールすることでインストールできます。

  1. 新しいプロジェクトを作成する

    dotnet new console --framework net5.0
    
  2. テキスト エディターでプロジェクト ファイルを開き、<TargetFramework>net5.0</TargetFramework><TargetFramework>net6.0</TargetFramework> に変更します。

    変更点を示すファイルの差分は次のとおりです。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
    -   <TargetFramework>net5.0</TargetFramework>
    +   <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    
  3. 省略可能な手順: 暗黙の using ディレクティブNull 許容のコンテキストのプロパティをプロジェクト ファイルに追加することで、新しい .NET 6 および C# の機能の一部を引き続き使用できます。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
    +   <ImplicitUsings>enable</ImplicitUsings>
    +   <Nullable>enable</Nullable>
      </PropertyGroup>
    
    </Project>
    

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

Visual Studio で新しいコンソール プロジェクトを作成すると、使用するターゲット フレームワークを指定するドロップダウン ボックスが表示されます。 この値を 5.0 に変更します。 プロジェクトが作成された後、プロジェクト ファイルを編集して、6.0 に戻します。

  1. 新しいプロジェクトを作成すると、セットアップ手順によって [追加情報] のセットアップ ページに移動します。 このページで、フレームワークの設定を .NET 6.0 (長期的なサポート) から .NET 5.0 に変更し、 [作成] ボタンを選択します。

    Visual Studio でターゲットの .NET Framework 5.0 が選択されています

  2. プロジェクトが作成されたら、 [プロジェクト エクスプローラー] ウィンドウを見つけます。 プロジェクト ファイルをダブルクリックし、<TargetFramework>net5.0</TargetFramework><TargetFramework>net6.0</TargetFramework> に変更します。

    変更点を示すファイルの差分は次のとおりです。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
    -   <TargetFramework>net5.0</TargetFramework>
    +   <TargetFramework>net6.0</TargetFramework>
      </PropertyGroup>
    
    </Project>
    

    または、 [プロジェクト エクスプローラー] ウィンドウでプロジェクトを右クリックし、 [プロパティ] を選択します。 [設定] ページが開き、ターゲット フレームワーク を変更できます。

    Visual Studio のプロジェクト プロパティを編集し、.NET Framework バージョンを設定します。

  3. 省略可能な手順: 暗黙の using ディレクティブNull 許容のコンテキストのプロパティをプロジェクト ファイルに追加することで、新しい .NET 6 および C# の機能の一部を引き続き使用できます。

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
    +   <ImplicitUsings>enable</ImplicitUsings>
    +   <Nullable>enable</Nullable>
      </PropertyGroup>
    
    </Project>
    

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

トップレベルのテンプレートは、.NET 6 の新機能です。 この機能への支持または反対を表明するには、GitHub イシュー #26313 に投票してください。