3

プリミティブ型のaList<>がC#(たとえば、List<int>)で作成される場合、リスト内の要素は値によって格納されますか、それとも参照によって格納されますか?

言い換えれば、C#はC++またはList<int>C++と同等ですか?std::vector<int>std::vector<shared_ptr<int>>

4

3 に答える 3

6

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

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>参照と、配列への内部参照です。(要素型が値型であっても、配列型自体は常に参照型です。)

于 2012-05-11T17:55:33.413 に答える
0

値の型は値ごとに格納されます。(プリミティブや構造体など)参照型は参照によって格納されます。(例:クラス)

于 2012-05-11T17:48:52.570 に答える
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<>か?コンパイラは警告しますか?これを試してみたいです。

于 2012-05-11T18:34:34.657 に答える