对象终结但不垃圾回收时的弱引用行为这是一道关于C#/.NET中对象终结和回收的学术题。背景阅读是C#LanguageSpecificationAutomaticMemoryManagement的第3.9节。当没有对该对象的显式引用时,它可能会被垃圾收集。它变得“有资格销毁”。在将来的某个时刻(例如,如果强制执行垃圾回收),将运行对象的析构函数。在析构函数中,如果保存了对对象的引用,则该对象将被终结,但不符合收集条件。这可能导致对象处于已完成但尚未收集的状态。规范的第3.9节就是一个例子。此时,该对象仍然存在,因为它还没有被垃圾回收。但是,引用该对象的WeakReference报告IsAlive值为false,表明该对象已被收集。核心问题是——IsAlive属性真正报告的是什么?我们知道我们不能相信此属性的值为true,因为它会在读取后不久变为false。但是false值是可信的,意味着(根据文档)该对象已被垃圾收集。那么在这种情况下IsAlive属性告诉我们什么?对象是否被垃圾收集并不严格,因为我们认为对象处于最终但未收集状态。这是一个显示行为的示例。公共类Dog{publicstaticDogKeepDogRef;公共字符串名称{得到;放;}公共狗(字符串名称){名称=名称;}~Dog(){Console.WriteLine("Dogdestructorfor"+Name+"called");Dog.KeepDogRef=这个;}publicvoidBark(){Console.WriteLine(Name+":Woof");}}和主程序的代码。如果运行代码,您会看到原始的WeakReference将IsAlive报告为false,即使我们重建了该对象。staticvoidMain(){Dogdog=newDog("Bowser");弱引用dogRef=newWeakReference(dog);//UnrefBowser,现在有资格销毁dog=null;GC.收集();GC.WaitForPendingFinalizers();//Bowser不再活着Console.WriteLine(string.Format("Objectstillalive:{0}",dogRef.IsAlive));//Bowser又活了DognewRef=Dog.KeepDogRef;newRef.Bark();如果你阅读了所有关于WeakReference的文档,很明显可以使用多种类型的弱引用。默认是生成一个短的弱引用。但是你也可以创建长而弱的引用来专门解释复活场景。来自TrackResurrection的文档:获取当前WeakReference对象引用的对象在完成后是否将被跟踪的指示。如果为true,则弱引用是长弱引用,并且在WeakReference构造函数中为trackResurrection参数指定了true。所以我想说,在解释IsAlive属性之前,大家一定要了解弱引用这部分内容。以上就是C#学习教程的全部内容:对象完成但还没有被垃圾回收时的弱引用行为。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
