gpt4 book ai didi

c# - 下面的代码会在类 "dies"之前被垃圾收集吗?

转载 作者:行者123 更新时间:2023-12-02 00:52:07 26 4
gpt4 key购买 nike

假设我们的类中有以下代码:

//class code
TextBox t = new TextBox();
ListBox l = new ListBox();

我们有两种可能的情况:

首先,我们将 qem1 声明为类变量(或属性,正如他们在 Java 世界中所说的那样):

//class variable
QuickEntryMediator qem1 = new QuickEntryMediator(t,l);

在第二个中,我们在方法中声明它:

//method variable
QuickEntryMediator qem2 = new QuickEntryMediator(t,l);

所以,我想说 qem1 在类超出范围之前永远不会被垃圾收集,而 qem2 可能在它所在的方法终止后的任何时间被垃圾收集。这是真的吗?

我正在寻找 C#(.net) 和 Java 的答案,因为我不确定这两种 GC 的工作方式是否相同!

谢谢

最佳答案

请注意,在 C# 中(我也相信 Java),当对象不再被强引用(直接或间接)时,该对象就有资格被收集,并且这可能发生在引用变量“超出范围”之前,只要不再使用引用。只要运行时可以确定不再需要对象(即,程序已完成对对象的任何引用),则可以在仍在范围内的情况下收集对象。

所以qem2可能早在“死亡”中定义的方法之前就有资格收集*我认为您的意思是返回),但这完全取决于如何qem2已使用。

通过以下简单的 C# 代码,在 Main() 开头创建互斥体可能会在创建后的任何时候被垃圾收集 - 它可能不会存在,直到 Main() 的范围结束。因为在它创建之后就没有任何东西引用它了。

static void Main(string[] args)
{
bool createdMutex;

System.Threading.Mutex mutex = new
System.Threading.Mutex(true,"myAppMutex",out createdMutex);

if (!createdMutex)
{
MessageBox.Show( "an instance of myApp is already running", "myApp running...");
return;
}

Application.Run();
}

请参阅以下内容了解更多信息。

请注意,至少在 .NET 中,在调试器下运行将使对象保持 Activity 状态,直到范围结束,因此如果您要对此进行测试,请确保在调试情况之外进行。

关于c# - 下面的代码会在类 "dies"之前被垃圾收集吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573410/

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