Я прочитал некоторые сведения о сборке мусора (как это работает и т. Д.).Я пытался понять, как это работает на моих примерах, но я думаю, что у меня проблема.Я знаю, что сборщик мусора запускается, когда:
недостаточно памяти,
вы вызываете 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);
}
}
Когда я нажимаю кнопку1, я создаю новый объект Тестирование._d является ссылкой на этот новый объект.Я сбрасываю память с помощью JetBrains dotTrace Memory и вижу, что этот новый объект существует.После нажатия кнопки 2 я устанавливаю для логического _first значение true, чтобы _d стало недоступным.В этот момент я подумал, что при запуске GC.Collect () GC «очистит» этот объект из стека, но я вижу, что он все еще существует.Я неправильно понял работу GC?или я делаю это неправильно?
Это работает, когда я устанавливаю _d = null;