2012-05-11 3 views
3

プリミティブ型のList<>がC#で作成された場合(例:List<int>)、リスト内の要素は値で保存されているのか、それとも参照によって格納されていますか?C#のプリミティブ型のコンテナは、値セマンティクスまたはポインタ/参照セマンティクスを使用しますか?

つまり、C#List<int>はC++ std::vector<int>またはC++ std::vector<shared_ptr<int>>に相当しますか?

+0

@fontanini:どのように私は自分自身を試すことができますか? –

+3

コピーが作成されたかどうかを判断するためには値の型を変更する必要があります。また、それが正常に動作しているかどうかをまだ理解していない場合はテストは重要ではありません。すべて簡単です。 – Servy

+0

intのリストを作成します。 intを作成します。それをリストに挿入します。元のintを変更します。リストに格納されているintの値を出力します。それらが等しければ、参照として、それ以外の場合は値渡しとなります。 – mfontanini

答えて

6

List<int>は、内部でint[]になります。通常、ボクシングは必要ありません - 値は配列に直接格納されます。もちろんあなたは、APIがobjectの観点で定義されている非ジェネリックIList、としてList<T>を使用することを選択した場合意志ボックス:

「は、参照によって格納された」というフレーズがある
List<int> list1 = new List<int>(); 

// No boxing or unboxing here 
list1.Add(5); 
int x = list1[0]; 

// Perfectly valid - but best avoided 
IList list2 = new List<int>(); 

// Boxed by the caller, then unboxed internally in the implementation 
list2.Add(5); 

// Boxed in the implementation, then unboxed by the caller 
int y = (int) list2[0]; 

に留意されたいです。混乱を招くもの - 「参照による」という用語は、通常、というパラメータの文脈で使用され、とは多少異なります。

List<string>(例えば)は、各要素値が参照である配列を含みますが、List<int>では各要素値は単にintです。含まれる参照は、List<int>への呼び出し側参照と配列への内部参照のみです。 (配列型自体は要素型が値型の場合でも、常に参照型です。)

+0

優れた答え。ありがとう。 –

0

値の種類は値で保存されます。 (プリミティブや構造体など)参照型は参照によって格納されます。 (クラスなど)

+3

「参照による」というフレーズは、ここでは有用ではありません。それはあまりにも多少異なる「合格基準」を連想させるものです。参照型の場合、要素の値は単に*参照です。 –

+0

すべてのリストは値を格納します。クラスの場合、値は単純に参照になりますが、値で保存されます。 (明示的にout/refを使用しない限り、すべてのパラメータが値渡されるのと同じ方法で) – Servy

+0

@JonSkeet、Servy:これは私が伝えようとしていたものですが、あまり混乱しない方法で状態を知る方法はわかりませんでした。明確化のためにありがとう。 – recursive

0

あなたは、このようなコードを書いたのであれば、何が起こるか:

struct MutableValueType 
{ 
    public int ChangableInt32; 
} 

static class Program 
{ 
    static void Main() 
    { 
    var li = new List<MutableValueType>(); 
    li.Add(new MutableValueType()); 
    li[0].ChangableInt32 = 42; 
    } 
} 

あなたはのコピーを変更しますあなたの構造体、またはList<>の中にあるコピーを変更しますか?コンパイラはあなたに警告しますか?私はこれを試してみたいと思います。

関連する問題