我花了一些时间学习弱引用在C#中是如何工作的,我遇到了这种奇怪的行为。
在下面的示例代码中,第一个测试通过,第二个测试失败。似乎你不能在构造之后但在创建对象的弱引用之前修改它的实例,而不能停止弱引用以预期的方式工作。
private class Simple
{
public Simple() { X = "Hello"; }
public string X { get; set; }
}
[Test]
public void CreatingWeakReferenceBeforeModifying()
{
var a = new Simple();
var aRef = new WeakReference(a);
a.X = "World"; // First modification to a after creating reference
a = null;
GC.Collect();
Assert.That(aRef.IsAlive, Is.False); // This assertion passes
}
[Test]
public void CreatingWeakReferenceAfterModifying()
{
var b = new Simple {X = "World"}; // First mod to b before creating ref
var bRef = new WeakReference(b);
b = null;
GC.Collect();
Assert.That(bRef.IsAlive, Is.False); // This assertion fails
}我是不是漏掉了什么?
发布于 2012-11-16 19:25:28
我怀疑您只有在某些情况下才会看到这种情况-在调试版本下尤其可能,特别是在调试器下。
这句话:
var b = new Simple {X = "World"};是有效的:
var tmp = new Simple();
tmp.X = "World";
var b = tmp;因此,即使您将b设置为null,堆栈上仍有一个局部变量具有对该对象的引用。
当在优化的场景中运行时,我希望GC注意到局部变量将永远不会被再次读取,并将其作为GC根忽略-但您运行它的方式可能不会让GC变得那么激进。
https://stackoverflow.com/questions/13415557
复制相似问题