【发布时间】:2015-10-21 20:25:23
【问题描述】:
假设一个类实例将构建数组:
class FooArrBuilder
{
public Foo[] FinalResult { get { return arr; } }
Foo[] arr;
public void BuildArr();
...
}
那么它是这样使用的:
Foo[] GetFooArr()
{
var fb = new FooArrBuilder();
fb.BuildArr();
...
return fb.FinalResult;
}
当一个数组被构建在一个函数的本地实例中时,该数组会被移出构建它的实例,还是整个实例都保存在内存中只是为了包含该数组?如果是后者,我不一定要复制数组 - 但也许我可以将类设为结构?感谢您的帮助:)
如果您愿意在此处详细说明 C# 的内存模型,它可能也会帮助我避免进一步的混淆。
提前致谢
【问题讨论】:
-
您可能想了解value types and reference types 以及garbage collection 的工作原理。
-
Nitpick - 它永远不会被“丢弃”,因为它没有实现
IDisposable。您要查找的术语是收集的垃圾。即使这样,它也只是有资格进行垃圾收集-确切地何时收集它是无法确定的。 -
简而言之,你的类和数组都是引用类型。只要一个对象是“可访问的”,即另一个活动对象有对它的引用,它也将保持活动状态。因此,只要您保留对数组的引用,它将保持活动状态。如果您不保留对创建数组的对象的引用,它可能会或可能不会在未来某个不确定的时间点被收集。