繁体   English   中英

C# 垃圾收集与 object 参考

[英]C# garbage collection with object references

在 C# 中,当我有两个 object obj1时, obj2List<string>组成,我将这两个对象分配给同一个List<string> object。

如果我对 obj1 的引用超出了 scope 但我对 obj2 的引用没有,那么 obj1 是否仍有资格进行垃圾收集,或者是否存在一些依赖问题,因为仍然存在对List<string> object 的引用?

在您的情况下, obj1必须有资格进行垃圾收集。

您需要在这里查看Jon Skeet's answer 它清楚地解释了垃圾收集如何在 object 引用上工作。

Object's Lifetime in C#

只要没有对 obj1 本身的引用,obj1 就应该有资格进行垃圾回收。

如果我对 obj1 的引用超出了 scope,但我对 obj2 的引用没有,那么 obj1 是否仍有资格进行垃圾收集,或者是否存在一些依赖问题,因为仍然存在对列表 object 的引用?

如果我理解正确,您的意思是obj1obj2都是List<string>类型,并且都指向同一个List<string>实例。

obj1离开 scope 时,仍然会有obj2作为对List<string>实例的活动引用,因此无法对列表进行垃圾回收。

如果 obj1 是堆上引用类型的一部分(即其属性之一),则它占用的 memory 空间可能会作为外部 object 的一部分被垃圾收集。 如果它只是堆栈上的引用,则不会涉及 GC,因为当 obj1 掉出 scope 时,堆栈将在方法调用结束时展开。

请记住,obj1 只是对堆上 object 的引用(在某种程度上是指针) - 只有当没有引用指向它时,才会对这个 object 进行垃圾收集。

这个问题中定义了 memory 的三种用途:

  • 指向名为obj1List<string>实例的指针。
  • 指向名为obj2List<string>实例的指针。
  • List<string>的实例。

如果obj1超出 scope,但obj2没有,那么垃圾回收后只剩下以下内容:

  • 指向名为obj2List<string>实例的指针。
  • List<string>的实例。

重要的是要记住 C# 在大多数情况下抽象出指针的概念,以便您可以安全地将obj1obj2视为List<string>而不是指针,而是它们的指针。

如果obj1是 List 的成员,则在对父 List 进行垃圾收集之前,它不能用于垃圾收集。

所以:

List<string> l = new List<string>();

string a = "one";
l.Add(a);

{
    string b = "two";
    l.Add(b);
}

在此列表的末尾, a在 scope 中, b在 scope 之外,但两者仍然在列表l中具有引用,因此两者都没有资格进行垃圾回收。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM