次の方法で共有


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
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

上記のコードでは、実際の名前空間はプロジェクト名によって異なります。

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

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

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

古いテンプレートを使用する場合は、この記事で後述する「古いプログラム スタイル 使用する」を参照してください。

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

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

最上位レベル ステートメント という用語は、コンパイラがメイン プログラムのクラス要素とメソッド要素を生成します。 コンパイラによって生成されたクラスとエントリ ポイント メソッドは、グローバル名前空間で宣言されます。 新しいアプリケーションのコードを見て、以前のテンプレートによって生成された Main メソッド内のステートメントがグローバル名前空間に含まれていることを想像できます。

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

最上位レベルのステートメントと 暗黙的な 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 ディレクティブが必要な場合は、最上位レベルのステートメントを含む .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 ディレクティブを削除することもできます。 たとえば、暗黙的な using ディレクティブ機能が <ImplicitUsings>enable</ImplicitUsings>で有効になっている場合、次の <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!");
        }
    }
    

手記

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

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