LoginSignup
25
11

More than 1 year has passed since last update.

C#9.0で提案されてる気になる6機能ピックアップ【前半】

Last updated at Posted at 2019-12-24

最初に

本記事はC#9.0に関する情報を自分なりにまとめて書いたものとなります。

普段C#をメインで使用している人もUnityを使ってゲーム開発している人にも、これからのC#に関する予習となれば幸いです。

あとこれアドカレ記事なんですが、完全に遅刻してます、すいません。

↓後半は以下から↓
https://qiita.com/4_mio_11/items/962ed9839019c799e6ba

C#9.0について

現在C#9.0はまだまだ計画段階であり、現在35の機能提案が行われています。

以下でC#の言語機能の提案・計画を確認することができます。

csharplang/projects

image.png

全てが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にてte1e2と型が異なる際に、e1又はe2T型へ暗黙的に変換を行います。

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チェックの簡略化のためだけに引数名最後に!をつける構文を使用してしまうより将来的に他のことで使ったほうがいいのでは という意見が特に目立ってるような…。

参考

25
11
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
11