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