プリミティブ型のaList<>
がC#(たとえば、List<int>
)で作成される場合、リスト内の要素は値によって格納されますか、それとも参照によって格納されますか?
言い換えれば、C#はC++またはList<int>
C++と同等ですか?std::vector<int>
std::vector<shared_ptr<int>>
プリミティブ型のaList<>
がC#(たとえば、List<int>
)で作成される場合、リスト内の要素は値によって格納されますか、それとも参照によって格納されますか?
言い換えれば、C#はC++またはList<int>
C++と同等ですか?std::vector<int>
std::vector<shared_ptr<int>>
AList<int>
はint[]
内部にあります。通常、ボクシングは必要ありません。値は配列に直接格納されます。もちろん、APIがで定義されてList<T>
いる非ジェネリックとして使用することを選択した場合は、次のようになります。IList
object
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<>
か?コンパイラは警告しますか?これを試してみたいです。