rksoftware

Visual Studio とか C# とかが好きです

C# 7.1 の使い方

Visual Studio 2017 Version 15.3.0 がリリースされました。
このリリースで C# 7.1 が使えるようになったので試してみます。

■ アップデート

Visual Studio のアップデートは ツール > 拡張機能と更新プログラム から行えます。

■ C# 7.1 の使い方

プロジェクトを新規作成しただけでは C# 7.0 しか使えません。C# 7.1 を使うには設定を行う必要があります。
1. プロジェクトのプロパティ > ビルド
2. ページの右下の [詳細設定]
3. [ビルドの詳細設定] ダイアログの 全般 > 言語バージョン
 [C# の最新のマイナーバージョン (最新)]
 または
 [C# 7.1]
 に設定。

■ 推定タプル名の使い方

C# 7.1 の新機能の一つ 推定タプル名 を使うには nugetSystem.ValueTuple をインストールする必要があります。

■ C# 7.1 の新機能

・非同期 Main メソッド

https://github.com/dotnet/csharplang/blob/master/proposals/async-main.md
Main メソッドを async にできます。

static async Task Main(string[] args)
{
    var text = await new System.Net.Http.HttpClient().GetStringAsync("http://rksoftware.hatenablog.com/");

    Console.WriteLine(new string(text.Take(200).ToArray()));
    Console.ReadKey();
}

・ジェネリックによるパターン マッチング

https://github.com/dotnet/csharplang/blob/master/proposals/generics-pattern-match.md
ジェネリック型の引数に対してのパターンマッチングが可能になりました。これまでは、下記の例では、Match<T> メソッドの引数 a に対するパターンマッチングはコンパイルエラーでした。

static void Main(string[] args)
{
    Console.WriteLine(Match("test"));   // string

    Console.ReadKey();
}

static string Match<T>(T a)
{
    switch (a)
    {
        case int v:
            return "int";
        case string v:
            return "string";
        default:
            return "default";
    }
}

・“既定” リテラル

https://github.com/dotnet/csharplang/blob/master/proposals/target-typed-default.md
型を推論できる個所では、規定値を設定する際の default(型名) の型名を省略できるようになりました。

static void Main(string[] args)
{
    // これまでは default(int) の様に型の指定が必要だった
    int i = default;
    Console.WriteLine(i);

    Console.WriteLine(D());

    Func<string> l = () => (string)default;
    Console.WriteLine(l() == null);

    string s = default;
    Console.WriteLine(s ?? default);
    Console.WriteLine(s == null? default:s);

    Console.ReadKey();
}

static DateTime D()
{
    return default;
}

・推定タプル名

https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.1/infer-tuple-names.md
タプルの使用時に、要素の名前が推定で付けられるようになりました。推定できない場合(一つの変数が複数回使われた場合など)はこれまで通り、ItemX という名前になります。

static void Main(string[] args)
{
    var pv = new System.Collections.Generic.KeyValuePair<int, int>(1, 2);
    var t1 = (pv.Value, pv.Key);
    
    // これまでは t.Item1 や t.Item2 となっていた
    Console.WriteLine(t1.Key);
    Console.WriteLine(t1.Value);

    int x = 3, y = 4;
    var t2 = (x, y);
    
    Console.WriteLine(t2.x);
    Console.WriteLine(t2.y);

    Console.ReadKey();
}

 
C# 7.1 はマイナーバージョンアップだけあって新機能は少ないですが、よりコードを書きやすくしてくれそうですぐに使いたいですね。