約一か月前に C# 7 の新機能についてライブコーディングをしたと思ったら、もうその情報だけでは足りていなくて焦っている今日この頃。
あれから Roslyn のリポジトリ には大きな変化がありました。
- future ブランチが master ブランチにマージされた!
- いくつかの新機能がさらに追加されている!
もはや毎日進捗を見てないとダメじゃないかと思うくらい、開発の速さに驚いています。最近新たに追加された新機能について実際に動かしてみたものベースで紹介して行きます。
out var
C# 6 のときに一度導入が検討されたけど見送りになった機能、変数宣言式が帰ってきました!前バージョンでの紹介の名残で変数宣言式と書いていますが、英語では「Out Variable Declarations」と呼ばれています。「返り変数宣言」とか訳したりするのかな...(知らんけど
どんな機能なのかは C# 6 のときに書いたものとほぼ同じなので、以下の記事をご参照くださいw (手抜き
簡単に概略を説明すると以下のような感じです。
//--- これまでのこんなコードを... static void Main() { int value; //--- イチイチ前に変数を宣言 if (int.TryParse("123", out value)) Console.WriteLine(value); } //--- こう書けるようになる! static void Main() { if (int.TryParse("123", out var value)) //--- 式の途中で変数を宣言して Console.WriteLine(value); //--- それを利用する }
必須じゃないけど地味に嬉しい、そんな機能かなと思います。
C# 6 で検討されていた仕様との差分
C# 6 のときは out 宣言した変数の寿命は、宣言したステートメントのスコープに限られました。C# 7 ではそのスコープに限定せず、通常の out 変数の利用と同じスコープで変数が有効になりました。
//--- C# 6 の頃に検討されていた仕様 static void Main() { if (int.TryParse("123", out var value)) { //--- このスコープでしか value 変数を使えない Console.WriteLine(value); } } //--- C# 7 ではこうなる static void Main() { if (int.TryParse("123", out var value)) { //--- このスコープでも当然使えるし Console.WriteLine(value); } //--- ここでも使える Console.WriteLine(value); }
なので、同一変数名で何度も TryParse な if 文を並べるようなことはできなくなりますが、これまでの out 変数と同じ挙動を優先したのだと推測します。