次の方法で共有


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# で有効です。 新しいバージョンを使用する場合は、 メソッドの本体のみを記述する必要があります。 コンパイラは、エントリ ポイント メソッドを使用して クラスを生成し、そのメソッド内のすべての最上位ステートメントを配置します。 生成されたメソッドの名前は特定されていません。これは、コードが直接参照できない実装の詳細です。 他のプログラム要素を含める必要はありません。コンパイラによって生成されます。 最上位レベルのステートメントを使用するときにコンパイラによって生成されるコードの詳細については、「C# ガイドの基礎」セクションの 最上位レベルのステートメント を参照してください。

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

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

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

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

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

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

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

最上位レベルのステートメントと 暗黙的な ディレクティブの両方、アプリケーションを構成するコードを簡略化します。 既存のチュートリアルに従うために、テンプレートによって生成された Program.cs ファイルに新しいステートメントを追加します。 記述するステートメントが、チュートリアルの手順での「メソッド」の開き中かっこと閉じ中かっこの間にあるとします。

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

最上位レベルのステートメントの詳細については、最上位レベルの ステートメントに関するチュートリアルの探索を参照してください。

暗黙的な ディレクティブ

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

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

その他のアプリケーションの種類には、これらのアプリケーションの種類に共通する名前空間が追加されています。

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

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

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

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

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

</Project>

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

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

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

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

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

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

dotnet new console --use-program-main

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

namespace MyProject;

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

Visual Studioで古いプログラム スタイルを使用する

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

    Visual Studioは最上位レベルのステートメント チェック ボックスを使用しません

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

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

手記

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

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