息抜き C# ~ New Normal なコードの書き方:第05回「Hello World!」 ~

f:id:ecb_smiyahara:20220216163830j:plain

こんにちはecbeingでアーキテクトをやっている宮原です。

New Normal なコードの書き方 の第05回目、今日は最新の「Hello World!」の書き方について解説していこうと思います。


本記事は 息抜きC# 記事の第05回目です。
第04回目「null許容参照型」はこちら。

2022年のハローワールド

Vsual Studioでコンソールアプリケーションを作ると、デフォルトでハローワールドのコードが生成させることはご存知でしょうか?

この自動生成コードですが、Vsual Studio 2022にバンドルされるC#10.0*1では革命が起こります。
まずは下記の画像を御覧ください。

【C#9.0までの自動生成コード】
f:id:ecb_smiyahara:20220216172141p:plain

【C#10.0の自動生成コード】
f:id:ecb_smiyahara:20220216172200p:plain


ひと目で分かる通り12行あったコードが2行に減っています。
これは長年C#に慣れ親しんできたベテランC#erにとっては非常にショッキングな出来事なのではないでしょうか?

なぜこのような記述が可能になったのかを説明します。

なくなったもの

Mainメソッド

まず、唯一残った「Console.WriteLine("Hello World!");」という記述がありますが、この記述を囲むMainメソッドがなくなっています。
ご存じの方も多いかもしれませんが、Mainメソッドは「エントリポイント」と呼ばれ、プログラムの開始位置として必要な関数になります。
従ってMainメソッドがなければコンパイルエラーになるはずです。

Programクラス

次にMainメソッドが所属するProgramクラスがなくなっています。
メソッドはクラス*2に所属する必要があるので、Mainメソッドが必須である以上Programクラス*3も必要なはずでした。

トップレベルステートメント

上記2つの消失を可能としたのがC#9.0から導入された「トップレベルステートメント」という機能です。

この機能はProgramクラスとMain関数を暗黙的かつ自動的に生成し、クラスや名前空間は外に処理コードを直接記述できるという非常に革命的な機能*4になります。

上述の通り「トップレベルステートメント」はC#9.0で導入された機能なので、自動生成コードこそ旧来のままですがC#9.0でのハローワールドは下記のように書くことが出来ます。

using System;
Console.WriteLine("Hello World!");

ただしトップレベルステートメントには下記の制限があります。

  • プロジェクト全体で1ファイルだけがトップ レベル ステートメントを持てる
  • クラスや名前空間よりも上にだけトップ レベル ステートメントを書ける

要するに、Mainメソッドの中身だけをトップレベルに記述できる機能、というわけです。
一見前衛的な機能ですが、コードの大半に影響を与えるようなものではありません。
サンプルコードや検証コードを書くときには重宝する機能となるでしょう。

なくなったもの2

さて、自動生成コードの比較に戻りましょう。C#10.0でなくなったものはまだあります。

namespace

Programクラスが所属するnamespaceがなくなっています。
・・・が、実はnamespaceの記述は元々必須ではありません*5
自動生成コードではお作法としてnamespaceを記述していたのでしょう。

usingディレクティブ

そして最後に「using System;」がなくなりました。
ここの部分の正式名称は「usingディレクティブ*6」といいます。
usingディレクティブは名前空間のインポートを行うため「Console.WriteLine("Hello World!");」の部分で、ConsoleクラスをSystem名前空間を指定せずに参照するためには必要な記述なはずでした。

暗黙的なusingディレクティブ

上記の「usingディレクティブ」が省略可能になった理由は、C#10.0で導入された「暗黙的なusingディレクティブ」という機能によるものです。
この機能はプロジェクトで利用される基本的なライブラリを暗黙的にインポートする機能で、コンソールアプリケーションの場合は*7下記のライブラリが暗黙的に読み込まれます。

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

これにより「using System;」の明示的な記述が不要となり、上記の通りの【C#10.0の自動生成コード】になるというわけです。

これが最新のハローワールドだ

さて、【C#10.0の自動生成コード】には1行目にコメントがあります。

おそらくこれは、あまりにもコードの見た目が変わったせいで、問い合わせが殺到することを恐れたマイクロソフトが、解説のためのURLを先頭に追加したものと思われますが、当然実行には不要なコードです。


従ってこの行を削除し、必須な1行のみが現在の最新ハローワールドと言えます。

Console.WriteLine("Hello, World!");


ということで「今のC#はハローワールドが 1行で書ける」というのが今回の結論になります。


第06回目「レコード型」はこちら。

ecbeingではコードスタイルの革命に興味があるエンジニアを募集しています!!

careers.ecbeing.tech

*1:プロジェクト作成時にフレームワークで「.NET 6.0」を選択すると自動的にC#10.0になります

*2:正確にはクラスか構造体かインターフェースです

*3:ちなみに名前はProgramじゃなくてもコンパイルは通ります

*4:ちなみにざっくりとした説明ですが、「トップレベル」とはクラスや名前空間の外側のこと、「ステートメント」とは処理コードのことです

*5:namespaceを記述しない場合、グローバル名前空間とみなされます

*6:リソースの確保と解放を行う「usingステートメント」というのもあるので、単に「using」と言って会話していると混乱することがあったりします

*7:暗黙的なusingディレクティブは、プロジェクトの種類に応じて最も一般的な名前空間をインポートします