◆ indexer

C#7 がでてるというのに C#6 の機能です

C# をちゃんと使い始めたのが C#6 使えるときだったので基本的に自然と C#6 の機能も使ってました

例えば

  • getter setter の初期値
    public int val {get; set;} = 0;
  • getter のみの値 (プロパティの readonly)
    public int val {get;} = 0;
  • ラムダ式風プロパティ・メソッド
    public int a => 0;
    public int plusOne(int a) => a + 1;
  • null 関連 (?. と ??)
    var val = maybe_null?.perhaps_null?["probably_null"] ?? "if_null";
  • 文字列中の式展開
    var str = $"1 + 1 = {1 + 1}";
  • nameof
    public string prop => this.getValue(nameof(prop));


と言う感じ

何が C#6 かはここ参考にしました
https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

他使ってないものはこんなのがありました

using static / catch を when でフィルタ / await の書ける場所が増えた /
Object Initializer が内部で呼び出す Add が拡張メソッドにも対応した /
オーバーロード解決の改善

using static は Ctrl+. で意識せずに使ってるかもです
await と Add と オーバーロードも意識してないだけで使ってるかもしれません

昔から使ってるようでもないと どの機能がいつから使えるのかっていうのが全然わからないですよね

Dictionary の初期化

長くなりましたがここからが本題です

上で紹介したのは普通に使っていたものなので C#6 の機能はだいたい使っていました
ですが Dictionary の初期化は古い書き方でした

最初の頃に調べて出てきたのがこんなのでした
var d1 = new Dictionary<string, int>
{
    { "key1", 100 },
    { "key2", 200 },
    { "key3", 300 },
};

Object Initializer だし 新しい方法かなって思ってたのですが Object Initializer って実は C#3.0 からの昔ながらの機能なんですね

この書き方は KeyValuePair を考えるとそうなるのですが いまいち Key と Value って感じがしないし {} が多くてネストになると見づらいです

それが indexer を使ってこう書けました
var d2 = new Dictionary<string, int>
{
    ["key1"] = 100,
    ["key2"] = 200,
    ["key3"] = 300,
};

見やすいです

JavaScript と近いのもいい感じです
var obj = {
["a"] : "a",
[1 + 3] : 4,
}