0

显然,如果我创建一个列表并用“new object()”填充它,那么它将存储对象的内存,但是如果我创建一个仅由已定义的对象组成的列表,这个列表本质上是一个列表吗?句柄,还是将所有数据/内存复制到列表中?

我只是想知道,这样我就可以编写更干净的代码,比如如果它实际上是在复制内存,那么我会做不同的事情,因为我不希望它复制内存,这会导致延迟。

您的答案是否也适用于数组?

4

1 回答 1

4

显然,如果我创建一个列表并用“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

有关更多信息,请参阅我关于值和引用类型以及参数传递的文章。

于 2012-08-11T08:14:52.133 回答