gpt4 book ai didi

c# - 垃圾收集器 C#,关于 'clearing' 对象的问题

转载 作者:太空狗 更新时间:2023-10-29 23:57:38 26 4
gpt4 key购买 nike

我阅读了一些关于垃圾回收的信息(它是如何工作的等等)。我试着了解我的示例是如何工作的,但我认为我有问题。我知道垃圾收集器在以下时间运行:
内存不够,
你调用 GC.Collect()。
这是我的代码:

public partial class Form1 : Form
{
public Testing _d;
public Boolean _first = false;

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
if (!_first)
{
_d = new Testing();
int test = _d.DoSomething("example");
}
}

private void button2_Click(object sender, EventArgs e)
{
_first = true;
}

private void button3_Click(object sender, EventArgs e)
{
//if (_first)
//{
// _d = null;
//}
GC.Collect();
}
}

public class Testing
{
private ASCIIEncoding _ascii;
private bool _disposed = false;

public Testing()
{
_ascii = new ASCIIEncoding();
}

public int DoSomething(string message)
{
return _ascii.GetByteCount(message);
}
}

当我单击 button1 时,我正在创建新的对象测试。 _d 是对这个新对象的引用。我正在使用 JetBrains dotTrace Memory 转储内存并看到这个新对象存在。单击 button2 后,我将 bool 值 _first 设置为 true,以便 _d 变得无法访问。在这一点上,我认为当我运行 GC.Collect() 时,GC 将从堆栈中“清除”该对象,但我发现它仍然存在。我误解了 GC 工作?还是我做错了?
它在我设置 _d = null;

时起作用

最佳答案

单击 Button2 不会使 _d 无法访问。

GC 仅收集未被根对象引用的对象。
只要您的表单引用了 _d,就不会被收集。

关于c# - 垃圾收集器 C#,关于 'clearing' 对象的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6359900/

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