2017-03-25 7 views
1

私はいくつかのC#トレーニングを行っており、これらの2つの間の違いを理解しようとしています。List<char>私は良い説明を見つけるのは大した運がなかった。これら2つの違いのリスト C#での初期化

私がデバッグすると、どちらも5というカウントが表示されます。最初の容量は5ですが、2番目の容量は8です。私はRaw View> Non-public-members> _itemsを見ると、

の値を示しています。違いを理解するのに役立ちます。前もって感謝します。

var vowels1 = new List<char>(new char[] {'a', 'e', 'o', 'u', 'i'}); 

var vowels2 = new List<char>(){'a', 'e', 'o', 'u', 'i'}; 
+0

構文上の砂糖。彼らは同じです。 – Psi

答えて

3

第二のコードは、それがこれに相当し、collection initializerを使用しています。

var vowels2 = new List<char>(); 
vowels2.Add('a'); 
vowels2.Add('e'); 
... 

容量値がリストに内部的に管理され、必要なときにそれが増加しています。最初のコードでは、長さが分かり、容量が5になるように配列をコンストラクタに渡しています。2番目のコードでは、アイテムが1つずつ追加され、その容量に基づいて容量が増えます。

表示される余分な項目は、List<T>クラスの内部配列の項目で、デフォルト値が初期化されています。構造体の配列(charが構造体です)を持つ場合、すべての値はデフォルト値に初期化されます。たとえば、10の整数の配列を作成すると0に初期化されます。これはcharと同じです。デフォルト値は\0です。

最後に両方のコードが同じことをしますが、あなたのリストには余分な項目がありません。デバッガで表示されているものは実装の詳細です。

+0

ありがとう!これは大いに役立ちます。私はこの答えに基づいて、私は答えを知っているが、他の意見を持ちたいと思う質問をフォローアップします。どちらが好ましい方法ですか?すべての情報を前に渡してからオブジェクトを構築するために余分な処理は必要ないので、最初のことを推測しています。それは正しいと思いますか?みんなありがとう! – HKstrongside

2

最初にリストがバッキングストアとして使用する配列を渡します。したがって、容量は5である。

第2は、パラメータのないコンストラクタを使用してインスタンス化するためのシンタクチック・シュガーであり、各要素でaddというメソッドをコールします(コレクション初期化子と呼ばれます)。 IIRCは、使用されるデフォルトのコンストラクタが4のときに設定される初期容量を設定します。その後、5番目の要素が追加されるとサイズが倍になります。

関連する問題