我阅读了一些与垃圾回收相关的信息(如其工作原理等)。我尝试通过自己的示例来理解它是如何工作的,但是我认为我遇到了问题。我知道垃圾收集器在以下情况下运行:
内存不足时,
您调用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时,我正在创建一个名为Testing的新对象。_d是对这个新对象的引用。我使用JetBrains dotTrace Memory转储内存并查看这个新对象是否存在。在点击button2后,我将布尔值_first设置为true,以使_d变得不可访问。此时,我认为当我运行GC.Collect()时,GC会从堆栈中“清除”这个对象,但我看到它仍然存在。我对GC的工作有误解吗?还是我的做法有误?
当我设置
_d = null;
时,它可以正常工作。