繁体   English   中英

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

[英]Why won't my WeakReference sample work?

我还有一个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()的调用,也没有任何乐趣。

我假设您正在Debug模式下运行此程序 ,在该模式下 ,运行时并不急于收集未引用的变量,并且不会优化代码以使您能够调试应用程序。

如果您在Release模式下编译并运行相同的代码, 通常会看到对WeakReference.IsAlive的第二次调用将在GC.Collect之后产生false。

这是我在发布模式下运行LINQPad 5的结果:

Matthew
[Done]
Matthew got destructed...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM