gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:51:12 26 4
gpt4 key购买 nike

我有另一个 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。

这是我在 Release模式下运行 LINQPad 5 时看到的:

Matthew
[Done]
Matthew got destructed...

关于c# - 为什么我的 WeakReference 示例不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35826128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com