2017-08-20 12 views
5
public class ListTest 
{ 
    public List<int> MyList; 
    public ListTest() 
    { 
     MyList = new List<int> { 1, 2, 3 }; 
    } 
} 

var listTest = new ListTest() 
{ 
    MyList = {4,5,6} 
}; 

listTest.MyListの値は分かりますか?C#new操作バグ?

それは{1,2,3,4,5,6}

enter image description

誰かがそれを説明することができますでしょう?

答えて

2

この構文は、コンストラクタの終了後に.Addを呼び出します。結果として、コンストラクタから1,2,3を取得し、4,5,6以上を1つずつ追加します。

+0

しかし、それは動作します。それは.addと同じですか? –

+1

@ L.Tim、それは代入演算子ですが、そうではありません。これは、 '{}'の間の項目に対するループの文法的な砂糖であり、すでにその項目を_初期化済みのコレクションに追加しています。 –

13

これはバグではありませんが、{ ... }イニシャライザの構文がC#でどのように機能するかの結果です。

この構文は、Add()メソッドを持つコレクションタイプで使用できます。また、中括弧内のシーケンスをAdd()メソッドの呼び出しのシーケンスに置き換えるだけです。

この例では、コンストラクタで最初の3つの要素の値を最初に初期化します。その後、後で{ 4, 5, 6 }をプロパティに割り当てると、その値でAdd()が再度呼び出されます。以前の内容を消去したい場合は

、あなたはこのように、newオペレータに割り当てる必要があります:

var listTest = new ListTest() 
{ 
    MyList = new List<int> {4,5,6} 
}; 

newオペレータを含むことによって、あなたは全く新しいオブジェクトだけでなく、両方を取得しますAdd()値。

3
var listTest = new ListTest() // This line will first call constructor of ListTest class . 
//As constructor adds 1,2,3 in list MyList will have 3 recrods 
{ 
    MyList = {4,5,6} // Once you add this statement this will add 3 more values in the list . 
    // So instead of creating new list it will Add 3 elements in existing list 
}; 

//Hence total 6 records will be there in the list