考虑这两个类:
public class A
{
B b;
public A(B b) { this.b = b; }
}
public class B
{
A a;
public B() { this.a = new A(this); }
}
Run Code Online (Sandbox Code Playgroud)
如果我有类似上面设计的类,那么垃圾收集器(GC)会收集这些类的对象吗?
假设我这样做:
void f()
{
B b = new B();
}
Run Code Online (Sandbox Code Playgroud)
在这个方法中,我创建了一个B被调用的实例b,当方法返回时,b超出范围,GC应该能够收集它,但是如果它要收集它,它必须先收集a它是成员的B,并收集a,它需要收集b第一是的构件A.它变成了圆形.所以我的问题是:这样的循环引用会阻止GC收集对象吗?
WeakReference课程?它的目的是什么?假设我在同一个程序集中有以下类
public class ParentClass : IDisposable
{
public ChildClass Child
{
get { return _child; }
}
}
public class ChildClass
{
public ParentClass Parent
{
get { return _parent; }
set { _parent= value; }
}
public ChildClass (ParentClass parent)
{
Parent= parent;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我错了,请纠正我,但这是糟糕的设计.这会导致内存泄漏或其他一些不可预见的问题吗?显然垃圾收集器能够处理这种循环引用.
编辑
如果这两个类最终在其他类中被这样使用怎么办?
ParentClass objP = new ParentClass ();
ChildClass objC =new ChildClass(objP);
objP.Child = objC;
Run Code Online (Sandbox Code Playgroud)
想一想......
我有一个理论认为CLR垃圾收集机制意味着我可以在对象层次结构中使用循环引用,而不会为拆卸和垃圾收集创建死锁.这是一个安全的假设吗?(目标语言VB.NET)
我读了问题的答案.事件处理程序是否阻止了垃圾收集的发生?,但是当发布者成为目标时会发生什么?
更具体地说,我正在为WPF应用程序使用MVVM设计.Model-View类会在每次更改时引发NotifyPropertyChanged.在某些类中,我需要在修改某些内容时调用方法.
我想这样做:
this.PropertyChanged += this.MyHandler;
Run Code Online (Sandbox Code Playgroud)
这个实例会被GC破坏吗?
垃圾收集器是否可以为交叉引用的对象/类释放资源,这些资源不再从主程序引用.例如 -
class class1
{
class2 m_RefClass2;
}
class class2
{
class1 m_RefClass1;
}
class class3
{
public class3()
{
class1 obj1 = new class1();
class2 obj2 = new class2();
obj1.m_RefClass2 = obj2;
obj2.m_RefClass1 = obj1;
}
}
Run Code Online (Sandbox Code Playgroud)