最初に
本記事はC#9.0に関する情報を自分なりにまとめて書いたものとなります。
普段C#をメインで使用している人もUnityを使ってゲーム開発している人にも、これからのC#に関する予習となれば幸いです。
あとこれアドカレ記事なんですが、完全に遅刻してます、すいません。
↓後半は以下から↓
https://qiita.com/4_mio_11/items/962ed9839019c799e6ba
C#9.0について
現在C#9.0はまだまだ計画段階であり、現在35の機能提案が行われています。
以下でC#の言語機能の提案・計画を確認することができます。
全てがC#9.0に確実に入るというわけではないのですが、この中でもいくつか気になる機能の方をピックアップして軽く紹介したいと思います。
ざっくり下記の機能について見て行きます。
- Records【前半】
- Discriminated Union【後半】
- null合体演算子での暗黙的変換【前半】
- 開発者向けへの警告【後半】
- 配列作成時における型の省略化【後半】
- 引数のnullチェック簡略化【前半】
このほかにも細かな構文の変更が提案されていますが、それは追々リリースされてからで…。
Records
インスタンスが保持しているデータの一部を変更したものを、新しく作成して差し替えることができるようになります。(https://github.com/dotnet/csharplang/blob/main/proposals/csharp-9.0/records.md)
class Point3D
{
public readonly float X;
public readonly float Y;
public readonly float Z;
public Point3D With(float x = this.X, float y = this.Y, float z = this.Z) => new Point3D(x, y, z);
}
var p = new Point3D(1.0, 2.0, 3.0);
p = p.With(x: 4.0);
ここで新しくWith
というキーワードが出てきました。readonly
なプロパティを書き換えられるこのWith
というメソッドは、オーバーロードによる解決でプロパティの変更差し替えを可能にしているみたいですが、この辺は本実装されてからぼちぼち確認していきたいです。
null合体演算子での暗黙的変換
T t = e1 ?? e2
にてt
とe1
とe2
と型が異なる際に、e1
又はe2
をT
型へ暗黙的に変換を行います。
(https://github.com/dotnet/csharplang/issues/2473)
void Test(List<int> list, uint? u)
{
IEnumerable<int> x = list ?? Array.Empty<int>();
long l = u ?? -1;
}
引数のnullチェック簡略化
引数の値がnullとなっているかどうかのチェックを簡略化することができます。
(https://github.com/dotnet/csharplang/issues/2145)
// これまでの書き方
void Test(string s)
{
if(s is null)
{
throw new ArgumentNullException(nameof(s));
}
...
}
// C# 9.0で提案されている書き方
void Test(string s!)
{
...
}
ただこちらの機能はなかなか賛否両論となっている印象です。このnullチェックの簡略化のためだけに引数名最後に!
をつける構文を使用してしまうより将来的に他のことで使ったほうがいいのでは という意見が特に目立ってるような…。