[C# 6.0新機能] 拡張メソッドによるコレクションの初期化

C# 6.0では拡張メソッドを使用した独自のコレクション初期化メソッドを定義することができます。
例としてSampleクラスを以下のように作成します。

class Sample
{
    public string Name { get; set; }

}

// 拡張メソッドでAddを定義
// 初期値の先頭に"Hello,"が追加される
static class SampleExtensions
{
    public static void Add(this List list, string name)
        => list.Add(new Sample { Name = $"Hello, {name}."});
}

上記Sampleクラスのインスタンス生成時に初期値を与えると、初期値の前に”Hello,”が追加されます。

var smp = new List<Sample>()
{
    "Eric", "Paul", "Billy"
};

[C# 6.0新機能] 例外フィルター

C# 6.0ではcatch句にフィルターを使用することができるようになりました。
フィルターはwhenで指定します。
以下は、『例外発生時にMessageプロパティに「例外」というメッセージが含まれている場合のみ』をwhenでフィルターしています。

try
{
    throw new Exception("例外エラー発生");
}
catch (Exception e) when (e.Message.IndexOf("例外") > -1)
{
    // 例外メッセージの先頭が"例外"で始まっている場合に処理
    Console.WriteLine("エラー発生");
}
catch
{
    Console.WriteLine("その他の例外発生");
}

[C# 6.0新機能] インデックス初期化子

C# 6.0では、インデックス初期化子が追加されました。
これにより、Dictionaryは宣言と初期化を同時に行うことが可能です。
従来だと以下のように記述していました。

Dictionary<string, string> fruit = new Dictionary<string, string>();
fruit["Apple"] = "リンゴ";
fruit["Orange"] = "みかん";

C# 6.0では以下のように記述することが可能です。
変数名fruitを記述する必要はなくなり、「[“Key”] = Value,」という形式で初期化ができます。

Dictionary<string, string> fruit = new Dictionary<string, string>()
{
    ["Apple"] = "リンゴ",
    ["Orange"] = "みかん",
};

インデックス初期化子はDictionaryだけではなく、インデクサでも使用可能です。

public class Sample
{
    private string[] names = { "Eric", "Paul"};

    public string this[int x]
    {
        get
        {
            return names[x];
        }
        set
        {
            names[x] = value;
        }
    }
}


Sample smp = new Sample()
{
    // インデックス初期化子を利用した初期化
    [0] = "Jhon",
    [1] = "Alex",
};

[C# 6.0新機能] nameof演算子

変数名やプロパティ名、クラス名などを文字列として取得したい場合があります。
これを実現するためにC# 6.0ではnameof演算子が追加されました。

public class Sample
{        
    private int _width = 20;
    private const string FIXED_STR = "固定文字列";

    private string SayHello(string name) => $"Hello {name}";

    public string FirstName { get; set; }

    public void PrintNames()
    {
        Console.WriteLine(nameof(Sample));      // クラス名
        Console.WriteLine(nameof(_width));      // フィールド
        Console.WriteLine(nameof(FIXED_STR));   // 定数
        Console.WriteLine(nameof(FirstName));   // メソッド
    }
}

[C# 6.0新機能] 簡易関数定義

関数本体のコードが1つの式からなる場合は => を使用して関数を定義することが可能になりました。

従来だと2つの値の足し算をするメソッドは以下のように記述します。

public int addNum(int x, int y)
{
    return x + y;
}

C# 6.0 では以下のように記述することが可能です。

public int addNum(int x, int y) => x + y;