今日、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 };
// ...
}
(詳細については、マイクロソフト)