[英]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.