2012-08-11 50 views
0

显然,如果我创建了一个列表并填充了“new object()”,那么它将存储该对象的内存,但是如果我创建了一个只包含已定义对象的列表,那么该列表本质上是句柄列表,还是将所有数据/内存复制到列表中?列出存储句柄/引用还是它们的值类型?

我只是想知道,这样我就可以写代码更干净,就像如果它实际上复制内存然后我会做不同的事情,因为我不希望它使内存拷贝,导致滞后。

你的答案也适用于数组吗?

+0

该列表将存储您分配给它的任何通用类型。无论是值类型还是参考类型。如果你有'List ',它将存储'int's作为值(因为int是一个值类型)。如果你是做一个'清单'其中'SomeClass'是一个类(引用类型),那么'reference'将被存储在列表中。 SomeClass的实际内存将被分配到堆上,并且数据的引用将被存储在列表中。 – 2012-08-11 08:05:08

回答

4

显然,如果我做了一个列表,并以“新的对象()”,然后将它保存为对象的内存填充它,

没有,它会被存储到对象的引用。 C#中任何表达式的值都是值类型值,引用或指针。 从来没有一个实际的对象。

所以这个:

List<object> objects = new List<object>(); 
objects.Add(new object()); 

是相同的:

List<object> objects = new List<object>(); 
object foo = new object(); 
objects.Add(foo); 

在这两种情况下,该列表将包含对对象的引用。这不仅是对列表的情况下 - 这是至关重要的,你明白它的分配,参数传递 - 任何凡在复制,基本上是这样。因此,作为一个简单的例子:

StringBuilder sb1 = new StringBuilder(); 
StringBuilder sb2 = sb1; 
// sb1 and sb2 now have the same value: a *reference* to an object 
sb2.Append("Hello"); 
Console.WriteLine(sb1); // Prints Hello 

查看value and reference types我的文章,并parameter passing以获取更多信息。

相关问题