C# でリストを配列のように初期化できるのはなぜですか? 質問する

C# でリストを配列のように初期化できるのはなぜですか? 質問する

今日、C# で次のことができることに驚きました。

List<int> a = new List<int> { 1, 2, 3 };

なぜこれができるのでしょうか? どのコンストラクタが呼び出されるのでしょうか? 自分のクラスでこれを実行するにはどうすればよいですか? これが配列を初期化する方法であることはわかっていますが、配列は言語項目であり、リストは単純なオブジェクトです...

ベストアンサー1

これは、.NET のコレクション初期化構文の一部です。次の条件を満たす限り、作成する任意のコレクションでこの構文を使用できます。

  • IEnumerable(できればIEnumerable<T>)を実装する

  • というメソッドがありますAdd(...)

何が起こるかというと、デフォルトのコンストラクターが呼び出され、その後、Add(...)初期化子の各メンバーに対して呼び出されます。

したがって、これら 2 つのブロックはほぼ同じです。

List<int> a = new List<int> { 1, 2, 3 };

そして

List<int> temp = new List<int>();
temp.Add(1);
temp.Add(2);
temp.Add(3);
List<int> a = temp;

あなたできる必要に応じて、たとえば、List<T>成長中にサイズが大きくなりすぎるのを防ぐために、代替コンストラクターを呼び出します。

// Notice, calls the List constructor that takes an int arg
// for initial capacity, then Add()'s three items.
List<int> a = new List<int>(3) { 1, 2, 3, }

メソッドはAdd()1 つの項目を取る必要はありません。たとえば、Add()メソッドはDictionary<TKey, TValue>2 つの項目を取ります。

var grades = new Dictionary<string, int>
    {
        { "Suzy", 100 },
        { "David", 98 },
        { "Karen", 73 }
    };

ほぼ以下と同じです:

var temp = new Dictionary<string, int>();
temp.Add("Suzy", 100);
temp.Add("David", 98);
temp.Add("Karen", 73);
var grades = temp;

したがって、これを独自のクラスに追加するには、前述のように、 を実装しIEnumerable(ここでも、できればIEnumerable<T>)、1 つ以上のAdd()メソッドを作成するだけです。

public class SomeCollection<T> : IEnumerable<T>
{
    // implement Add() methods appropriate for your collection
    public void Add(T item)
    {
        // your add logic    
    }

    // implement your enumerators for IEnumerable<T> (and IEnumerable)
    public IEnumerator<T> GetEnumerator()
    {
        // your implementation
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

その後、BCL コレクションと同じように使用できます。

public class MyProgram
{
    private SomeCollection<int> _myCollection = new SomeCollection<int> { 13, 5, 7 };    

    // ...
}

(詳細については、マイクロソフト

おすすめ記事