rksoftware

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

C# 2.0 以降の新機能の確認 - C# 6.0 - 拡張メソッドでコレクション初期化子

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

拡張メソッドでコレクション初期化子

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/object-and-collection-initializers#collection-initializers
 Add メソッドが拡張メソッドで定義されている型も、初期化子を指定できる。

class Program
{
    static void Main(string[] args)
    {
        MyClass c = new MyClass() { "saitama", "gunma", "ibaraki" };
        Console.WriteLine(c);   // saitama, gunma, ibaraki
    }
}

// Add 拡張メソッド
static class MyClassExtension
{
    internal static void Add(this MyClass c, string text)
    {
        c.Push(text);
    }
}

// Add 拡張メソッドをつけるのは IEnumerable<T> を実装する必要があるため、実装クラスの宣言
class MyClass: IEnumerable<string>
{
    private List<string> _texts = new List<string>();
    internal void Push(string text) { _texts.Add(text); }
    public override string ToString() { return string.Join(", ", _texts); }
    public IEnumerator<string> GetEnumerator() { return _texts.GetEnumerator(); }
    IEnumerator IEnumerable.GetEnumerator() { return _texts.GetEnumerator(); }
}