次の方法で共有


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

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

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

.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 メソッドを使用して、新しいプログラム スタイルを古いスタイルに変換します。

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

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

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

最上位レベルのステートメントという用語は、コンパイラがメイン プログラムのクラス要素とメソッド要素を生成します。 コンパイラは、グローバル名前空間で生成されたクラスとエントリ ポイント メソッドを宣言します。 新しいアプリケーションのコードを見て、以前のテンプレートによって生成された 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 ディレクティブを無効にする

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

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

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

</Project>

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

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

特定の暗黙的なusing ディレクティブを削除するには、<Using>属性を持つRemove項目をプロジェクト ファイルに追加します。 たとえば、暗黙的な 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#、詳細設定を参照してください。