アンセケターメンはてなエディション

いつどこで誰に見られても恥ずかしいコードが置かれています

C#の矢印っぽいやつ(=>)が使われている場所をEnumerate

Pythonみたいにインデントでブロックを表す言語と、C++C#みたいに{}を使ってブロックを表す言語、どっちが見やすいんだろうみたいな話をしていたときにふと思いました。

ということで思いついたのをつらつらと並べ立てていきます。

あ、この=>はラムダ演算子というそうです。

いつの間にか「C# =>」でググれるようになってましたね。昔はC#をググっても#が認識されなくてググラビリティ低いなと思ってたけど、時代は変わりました。

ラムダ式

C# 3で追加。ラムダ演算子というくらいなのでもはや言うまでもないですが、ラムダ式に使われています。匿名関数はさようなら。

var yaginuma = audioList.Where(x => x.Composer == "八木沼悟志");

式形式のメソッド

C# 6で追加。英語だと「expression-bodied function member」。クラスのメソッドをちょっと簡単に書けます。

public string Sum(int x, int y) {
  return x + y;
}
//こう書ける
public string Sum(int x, int y) => x + y;

読み取り専用プロパティ

C# 6で追加。getアクセサだけのプロパティを簡潔に書けます。

private int _x;

public int X { get { return this._x; } }
//こう書ける
public int X => this._x;

ついでに自分が引っかかった点を紹介。

public class A {
  public A Instance => new A();
  //これは下と同じ意味なので、アクセスするたびにインスタンスが生成される
  public A Instance {
    get { return new A(); }
  }
  
  //シングルトン的運用ならこの書き方じゃないとダメ
  public A Instance { get; } = new A();
}

式形式の色々

C#7で追加。コンストラクタ、デストラクタ、プロパティ(get/setアクセサ)、インデクサ、イベントでも使えるようになりました。大体Rxを使っちゃうのでイベントはよく知らないし、インデクサも使った記憶がないので省略。

public class A {
  private int _x;
 //コンストラクタ
  public A (int x) {
    this._x = x;
  }
  //こう書ける
  public A (int x) => this._x = x;
  
  //デストラクタ
  ~public A () {
    this._x = 0;
  }
  //こう書ける
  ~public A () => this._x = 0;
  
  //プロパティ
  public int X {
    get { return this._x; }
    set { this._x = value; }
  }
  //こう書ける
  public int X {
    get => this._x;
    set => this._x = value;
  }
}

switch式

C# 8で追加。条件次第ですが、今までのbreakとかdefaultとかめんどくさい構文を使わなくてよくなりました。

//関係演算パターンマッチング使ってるのでC# 9以降で動く
public string GetName(int height) => height switch{
  >180 => "Yaginuma",
  <150 => "Nanjo",
  _ => "hentai"
};

まとめ

LINQで使われているイメージが強い=>ですが、C#のバージョンが上がるごとにいろいろなところで使えるようになってきています。

使わなくても書ける簡略記法みたいな側面があるので、わりと初見殺しというかC#初学者にとっては結構負担が大きそうだなというのは感じています。新人がコードを読むときも「この矢印って何ですか?」と頻繁に聞かれたし。

参考

ufcpp.net