C#の最新言語9.0では何ができるようになったのか?

この記事を読むと以下の3つのことがわかります。
● C#の最新バージョン9.0が2020年5月にリリースしたこと
● 新たな型「レコード(record)」が導入されたこと
● トップレベルのステートメントで不要な式が削除されたこと

C#の最新バージョン9.0が2020年5月にリリース

2020年5月、マイクロソフトは2000年にアンダース・ヘルスバーグが設計したプログラミング言語、C#の最新言語バージョン9.0をリリースしました。それから約6ヶ月後の2020年11月、今度は「.NET Framework」「.NET Core」を統合させた「.NET 5」を続けてリリースし、この「.NET 5」では早くもC#の最新バージョン9.0が採用されました。

早いスパンでのバージョン更新を続けるマイクロソフトは益々注目が集まる中、C#の9.0について「より明確でシンプルなものを心掛けた」とコメントしました。実際に中身を確認してみると、今回のC#9.0は、また一歩理想的なツールに近づいたようです。*注1

注目して欲しい「2つの機能」

C#9.0は一体どんなことができるようになったのでしょうか?今回は追加された新機能のうち、注目して欲しい「2つの機能」についてご紹介します。

●新たな型「レコード(record)」が追加
●トップレベルのステートメントで不要な式を削除

どちらの機能も今覚えておいて損はない、これまで使いたくてもなかなか実現できなかったことができるようになった仕様ですのでぜひご覧ください。

新たな型「レコード(record)」が追加

C# 9.0 には “レコード型” が導入されました。このレコード型は、これまで変更できなかった参照型をクラスまたは構造体の代わりとして作成できます。今までC#で参照型を作成する場合、余分なコードをいくつも記述する必要がありましたが、これからはレコード型を使って、

・軸となるコードを作る
・そこから派生するコードを追加することで必要なデータを抽出

上記の流れに沿ってシンプルかつ簡単に必要なコードだけを書けば良い仕様になったのです。

レコード型がクラスと違う点を理解しておこう

レコード型がクラスと違う点はコードが値ベースの等値性として認識されることです。例えば作成したレコードの2つの変数の定義が同じで、両方の値が等しい場合、これはイコールだと判断されます。値ベースの等値性が採用されたことにより応用した式が簡単に追加できるようになりました。

レコード型を体験してみよう

シンプルかつ簡単に必要なコードだけを書けばいい、具体的にはどんな風にレコード型を使えるのか?基本のコードで体験してみましょう。

例えばPersonというレコードを一つ作成したとします。

次にこのPersonを使ってTeacherという派生レコードを作成します。

3番目のコードはレコードをシールする方法(sealed)を使ってStudentという派生レコードを作ります。

最初に作成したPersonが軸となり、そこからTeacherとsealedを使ったStudentが派生しているのが分かります。C#9.0はこのように後からプログラムを改修する人が見ても分かりやすいコードの書き方を実現しました。

これは確かにシンプルで便利な新機能です。初心者でプログラムのコードの意味がまだ良く分からない人でも、どこで区切られているのか、何をやろうとしているのか、把握しやすくなったのではないでしょうか。

レコード型をもっと応用して使ってみよう!

レコード型について今度はもう少し難易度を上げてコードを作成していきます。レコード型はそもそもどんな場面に向いているのか?マイクロソフトは「データと統計に関するものがレコード型に適している」とコメントしたことがありました。例えばどんなシチュエーションなのかというと、日・週・月に分けて熱使用量を追跡するような次の2つの設定が挙げられます。

・暑い日が多ければ空調の使用量が増える調査
・植物の生育量の管理

それでは上記2つの例に共通して使える元データ・度日数を算出するコードを作ってみましょう。度日数を計算するにはその日の最高気温と最低気温が基礎データになるので、まずはこの2つのデータの抽出方法をコードに書き下ろします。

このコードは位置指定レコードと定義され、HighTempと LowTempを含む参照型と認識されます。.NET5はこれを初期化専用プロパティとして処理します。

次は度日数を計算する

次は基本の式を応用して度日数のデータを収集します。度日数とは、基準温度と特定の日の平均気温との差を計算したものです。基準の温度よりも高ければ冷房を使う日、基準の温度よりも低ければ暖房を使う日、このようにデータから空調の使用量などが調査できます。

派生レコードの軸となるDegreeDaysレコードは、HeatingDegreeDaysレコードとCoolingDegreeDaysレコードの両方に対する共有基底クラスです。一見コードが長く難しそうに見えるかもしれませんがsealedを使いながら追加している構造なので、コピーやクローンの作成はかなり容易になったといえるでしょう。*注2

レコード型が導入されるまでは余分なコードをいくつも記述する必要がありました。余計なものが多ければ多い程バグが多かったのですが、これからはこのレコード型を使うことでコードを書く作業は随分と楽になるかもしれません。

トップレベルのステートメントで不要な式を削除

何行も続くコードは、

・開発するのが大変
・あとで改修するのも面倒
・行が増えれば増えるほどバグになる可能性も上がる

という3拍子揃った厄介者でした。「もしもたった一行で全てが指示できるプログラムがあったとしたらどんなに楽だろうか?」と頭の中を巡らせてもそんなことは夢のまた夢だったはずです。しかしC#9.0でマイクロソフトはついに不要な式をできるだけ削除、たった数行のコードを書くだけであとは自動的にコンパイルされるという機能を実現しました。

C#9.0ではtop-levelと呼ばれるクラスや名前空間よりも外側にあるファイルの直下にステートメントが直接書けます。具体的にどんな仕様になったのか?トップレベルのステートメントの一例を挙げてみましょう。

型宣言およびMainメソッド宣言が省略できる

例えば、初心者がよく最初に作成するwebサイトに「HelloWorld!」と表示するプログラムがあります。これまでは下記のようなコードの書き方が一般的でした。

しかしこれがC#9.0になるとステートメントが直接記述できるので、たった2行で動作するようになったのです。

上記2行以外のこれまで必要だったはずのコードはコンパイル時に自動で展開される仕様になりました。これまで必要だったMainも自動で作成されるのでこれからは、上記2行以外自分で作成する必要がなくなったのです。なんて便利なのでしょうか。*注3

トップレベルのステートメントを使用する際の注意点

トップレベルのステートメントを使用する際は下記2点について注意が必要です。

・プロジェクトで1ファイルのみトップレベルステートメントが作ることが可能
・トップレベルステートメントはクラスや名前空間よりも上に書かなければならない

このルールを守らないとエラーになってしまいますのでご注意下さい。

◆まとめ

今回のC#最新言語「C#9.0」は前回の「C#8.0」が出てから1年待たずにリリースされるという、かなり短い期間でのアップデートとなりました。急いでリリースしたのは、2020年5月にリリースされた「Blazor WebAssembly 3.2.0」や2020年11月にリリースされた「.NET 5」と帳尻を合わせる形だけかと思いましたが、新機能は予想を遥かに超えた便利さを持ち合わせているようです。

C#9.0のリードデザイナーであるMads Torgersen氏は今後も普遍性を兼ね備えたものを作っていきたいとコメントしていますので、今のうちに新機能を使えるようにしておくと便利かもしれません。




新卒エンジニア募集中

株式会社キャパでは21卒、22卒新卒募集をしています。
私たちと一緒に働きませんか?
募集概要について詳しくは


■参考文献
注1:https://devblogs.microsoft.com/dotnet/c-9-0-on-the-record/
注2:https://docs.microsoft.com/ja-jp/dotnet/csharp/tutorials/exploration/records
注3:
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-9

関連記事一覧