为什么我的WeakReference示例不起作用?

时间:2016-03-06 11:09:26

标签: c# oop

我有另一个C#理论问题我希望我能够清楚一点,我已经看过一些WeakReference样本,但它们从来没有为我工作但是我读过一些人的评论和文章,样本适用于他们。我正在努力找出为什么这些样品不适合我。我不知道它是否是GC.Collect()的非确定性行为,我也在努力确定它是否适用。这是我目前正在处理的代码,但我已经从教程中直接尝试了许多其他代码来说明这个概念:

class Program
{
    static WeakReference _weak;

    static void Main(string[] args)
    {
        _weak = new WeakReference(new WeakClass { Name = "Matthew" });

        if (_weak.IsAlive)
        {
            Console.WriteLine((_weak.Target as WeakClass).ToString());
        }

        GC.Collect();

        if (_weak.IsAlive)
        {
            Console.WriteLine("IsAlive"); // This is always being printed when, according to the articles, it shouldn't be
        }

        Console.WriteLine("[Done]");
        Console.Read();
    }
}
class WeakClass
{
    public string Name { get; set; }
    public override string ToString()
    {
        return this.Name;
    }
    ~WeakClass()
    {
        Console.WriteLine(string.Format("{0} got destructed...", this.Name));
    }
}

在调用GC.Collect()之后,WeakRerence仍然存在。我也试过添加对GC.WaitForFullGCComplete()和GC.WaitForPendingFinalizers()的调用,但没有任何乐趣。

1 个答案:

答案 0 :(得分:3)

我假设您在调试模式中运行此操作,其中运行时并不急于收集未引用的变量并且不会优化您的代码为了使您能够调试您的应用程序。

如果您在发布模式中编译并运行相同的代码,那么 通常会看到第二次调用WeakReference.IsAlive后会产生错误GC.Collect

这就是我在发布模式下运行LINQPad 5的原因:

Matthew
[Done]
Matthew got destructed...