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
を使用し、終了コードを設定します。 関数を追加することもできます。 これらは、生成されたエントリ ポイント メソッド内に入れ子になったローカル関数として作成されます。 ローカル関数には、アクセス修飾子 (public
や protected
など) を含めることはできません。
最上位レベルのステートメントと 暗黙的な 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 で古いプログラム スタイルを使用する
新しいプロジェクトを作成すると、セットアップ手順が [追加情報 セットアップ ページに移動します。 このページで、[ 最上位レベルのステートメントを使用しない] チェック ボックスをオンにします。
Visual Studio
プロジェクトが作成されると、
Program.cs
コンテンツは次のようになります。namespace MyProject; class Program { static void Main(string[] args) { Console.WriteLine("Hello, World!"); } }
手記
Visual Studio では、同じテンプレートに基づいてプロジェクトを次回作成するときにオプションの値が保持されるため、コンソール アプリ プロジェクトを次回作成する場合は、既定で [最上位レベルのステートメントを使用しない] チェック ボックスがオンになります。
Program.cs
ファイルの内容は、グローバルな Visual Studio テキスト エディター設定または EditorConfig
ファイルで定義されているコード スタイルと一致するように異なる場合があります。
詳細については、「EditorConfig と
.NET