プリミティブ型のList<>
がC#で作成された場合(例:List<int>
)、リスト内の要素は値で保存されているのか、それとも参照によって格納されていますか?C#のプリミティブ型のコンテナは、値セマンティクスまたはポインタ/参照セマンティクスを使用しますか?
つまり、C#List<int>
はC++ std::vector<int>
またはC++ std::vector<shared_ptr<int>>
に相当しますか?
プリミティブ型のList<>
がC#で作成された場合(例:List<int>
)、リスト内の要素は値で保存されているのか、それとも参照によって格納されていますか?C#のプリミティブ型のコンテナは、値セマンティクスまたはポインタ/参照セマンティクスを使用しますか?
つまり、C#List<int>
はC++ std::vector<int>
またはC++ std::vector<shared_ptr<int>>
に相当しますか?
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>
への呼び出し側参照と配列への内部参照のみです。 (配列型自体は要素型が値型の場合でも、常に参照型です。)
優れた答え。ありがとう。 –
値の種類は値で保存されます。 (プリミティブや構造体など)参照型は参照によって格納されます。 (クラスなど)
あなたは、このようなコードを書いたのであれば、何が起こるか:
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<>
の中にあるコピーを変更しますか?コンパイラはあなたに警告しますか?私はこれを試してみたいと思います。
@fontanini:どのように私は自分自身を試すことができますか? –
コピーが作成されたかどうかを判断するためには値の型を変更する必要があります。また、それが正常に動作しているかどうかをまだ理解していない場合はテストは重要ではありません。すべて簡単です。 – Servy
intのリストを作成します。 intを作成します。それをリストに挿入します。元のintを変更します。リストに格納されているintの値を出力します。それらが等しければ、参照として、それ以外の場合は値渡しとなります。 – mfontanini