xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

変数宣言式

約一か月前に C# 7 の新機能についてライブコーディングをしたと思ったら、もうその情報だけでは足りていなくて焦っている今日この頃。

あれから Roslyn のリポジトリ には大きな変化がありました。

  1. future ブランチが master ブランチにマージされた!
  2. いくつかの新機能がさらに追加されている!

もはや毎日進捗を見てないとダメじゃないかと思うくらい、開発の速さに驚いています。最近新たに追加された新機能について実際に動かしてみたものベースで紹介して行きます。

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 変数と同じ挙動を優先したのだと推測します。