0
显然,如果我创建了一个列表并填充了“new object()”,那么它将存储该对象的内存,但是如果我创建了一个只包含已定义对象的列表,那么该列表本质上是句柄列表,还是将所有数据/内存复制到列表中?列出存储句柄/引用还是它们的值类型?
我只是想知道,这样我就可以写代码更干净,就像如果它实际上复制内存然后我会做不同的事情,因为我不希望它使内存拷贝,导致滞后。
你的答案也适用于数组吗?
显然,如果我创建了一个列表并填充了“new object()”,那么它将存储该对象的内存,但是如果我创建了一个只包含已定义对象的列表,那么该列表本质上是句柄列表,还是将所有数据/内存复制到列表中?列出存储句柄/引用还是它们的值类型?
我只是想知道,这样我就可以写代码更干净,就像如果它实际上复制内存然后我会做不同的事情,因为我不希望它使内存拷贝,导致滞后。
你的答案也适用于数组吗?
显然,如果我做了一个列表,并以“新的对象()”,然后将它保存为对象的内存填充它,
没有,它会被存储到对象的引用。 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以获取更多信息。
该列表将存储您分配给它的任何通用类型。无论是值类型还是参考类型。如果你有'List',它将存储'int's作为值(因为int是一个值类型)。如果你是做一个'清单'其中'SomeClass'是一个类(引用类型),那么'reference'将被存储在列表中。 SomeClass的实际内存将被分配到堆上,并且数据的引用将被存储在列表中。 –
2012-08-11 08:05:08