我正在花一些时间学习弱引用在 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
}
我在这里错过了什么吗?