我的理解是,在对WeakReference
的Target
的所有强引用设置为空并调用GC之后,该弱引用应该不再有效.
然而,下面的代码似乎并不符合这一预期:
static void Main(string[] _) {
var person = new Person();
var wr = new WeakReference(person);
person = null;
// We should have access to the person here
if (wr.Target is Person shouldExist)
{
Console.WriteLine($"Person exists! IsAlive: {wr.IsAlive}.");
shouldExist = null;
}
else
{
Console.WriteLine($"Person does not exist :( IsAlive: {wr.IsAlive}.");
}
// Invoke GC.Collect.
GC.Collect();
if (wr.Target is Person shouldNotExist)
{
Console.WriteLine("This person should have been garbage collected");
Console.WriteLine($"IsAlive: {wr.IsAlive}");
}
else
{
Console.WriteLine("This person was garbage collected and weak reference is no longer alive");
Console.WriteLine($"IsAlive: {wr.IsAlive}");
}
}
哪里
class Person
{
private int mI = 3;
public int MI { get => mI; set => mI = value; }
}
输出结果是
Person exists! IsAlive: True. This person should have been garbage collected IsAlive: True个
我原以为输出为:
Person exists! IsAlive: True. This person was garbage collected and weak reference is no longer alive IsAlive: False个
我在这里错过了一些关于弱引用如何工作的东西吗?