[C#] トップレベルのステートメントを試す
はじめに
.NET 6 から、Program.cs は「最上位ステートメント」で作成されます.
今回は「最上位ステートメント」を使ってみます.
環境
デフォルトのコンソール プロジェクトで「トップレベル ステートメント」を試す
まず、「dotnet new console」でコンソール プロジェクトを作成します.
Program.cs
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
ilspy-vscode で逆コンパイルします.
Program.cs
using System;
using System.Runtime.CompilerServices;
[CompilerGenerated]
internal class Program
{
private static void <Main>$(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
その結果、クラスとメイン メソッドが生成されました.
「args」からコマンドライン引数を取得できます.
Program.cs
foreach(var a in args)
{
Console.WriteLine($"arcuments: {a}");
}
Console.WriteLine("Hello, World!");
名前空間 ?
クラスを名前空間に入れることはできますか?いいえ.
Program.cs
namespace TopLevelStatementSample;
// Compiling error
Console.WriteLine("Hello, World!");
Program.cs
namespace TopLevelStatementSample
{
// Compiling error
Console.WriteLine("Hello, World!");
}
error CS0116: A namespace cannot directly contain members such as fields, methods or statements
もちろん、中括弧を使用して名前空間に入れることもできません.
複数のファイル
「最上位ステートメント」で書かれているファイルをもう 1 つ追加できますか?いいえ.
SampleClass.cs
// Compiling error
void Greet(string message)
{
Console.WriteLine("Hello sample class");
}
error CS8802: Only one compilation unit can have top-level statements.
別のメイン クラスの追加
静的な「メイン」メソッドを持つファイルをもう 1 つ追加できますか?はい.
SampleClass.cs
namespace TopLevelStatementSample;
public class SampleClass
{
public static void Main(string[] args)
{
Console.WriteLine("Hello sample class");
}
}
しかし、警告が表示され、"SampleClass"がメイン クラスとして扱われません.
warning CS7022: The entry point of the program is global code; ignoring 'SampleClass.Main(string[])' entry point.
結果
Hello, World!
クラス、メソッド、および変数を追加する
クラスを Program.cs に追加できます.
しかし、ファイルの一番下にしか書き込めません.
クラス
Program.cs
using TopLevelStatementSample;
class Sample1
{
// can't write classes at the top of the file.
}
// Compiling error
Console.WriteLine("Hello, World!");
class Sample2
{
// can't write classes at the middle of the file.
}
// Compiling error
SampleClass.Main(new string[0]);
var s3 = new Sample3();
class Sample3
{
// OK.
}
メソッドと変数
ファイルのどこにでもメソッドと変数を書くことができます.
Program.cs
using TopLevelStatementSample;
void Greet(string message)
{
Console.WriteLine(message);
}
// OK
var message = "Hello message";
// OK
Greet(message);
SampleClass.Main(new string[0]);
それらはグローバルとして扱われるため、他のクラスもそれらを見ることができます.
ただし、Program.cs のメソッドや変数を呼び出すことはできません.
SampleClass.cs
namespace TopLevelStatementSample;
public class SampleClass
{
public static void Main(string[] args)
{
// Compiling error
Greet("Hello sample class");
}
}
error CS8801: Cannot use local variable or local function 'Greet' declared in a top-level statement in this context.
アウトロ
「トップレベル ステートメント」はエントリ ポイント専用であるため、「dotnet new」コマンドによってのみ作成されます.
暗黙の処理(コマンドライン引数など)が気になりますが、慣れれば問題はなくなると思います.
資力
Reference
この問題について([C#] トップレベルのステートメントを試す), 我々は、より多くの情報をここで見つけました https://dev.to/masanori_msl/c-try-top-level-statements-47koテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol