Вызывается ли сборщик мусора Dispose()?
Я думал, что GC вызовет Dispose в конечном итоге, если ваша программа не будет, но вы должны вызвать Dispose() в своей программе, чтобы сделать дефрагментацию очистки.
Однако из моей маленькой тестовой программы я вообще не вижу Dispose для вызова...
public class Test : IDisposable
{
static void Main(string[] args)
{
Test s = new Test();
s = null;
GC.Collect();
Console.ReadLine();
}
public Test()
{
Console.WriteLine("Constructor");
}
public void Dispose()
{
Console.WriteLine("Dispose");
}
}
//Вывод - это просто "Конструктор", я не получаю "Dispose", как я ожидал. Что?
РЕДАКТИРОВАТЬ: Да, я знаю, что я должен вызвать Dispose() - я выполняю стандартный шаблон при использовании одноразовых объектов. Мой вопрос возникает из-за того, что я пытаюсь найти утечку в чей-то код elses, которым управляет С++ (другой уровень сложности, который был бы хорошим предметом другого потока).
Ответы
Ответ 1
GC не вызывает Dispose
, он вызывает ваш финализатор (который вы должны сделать call Dispose(false)
).
Пожалуйста, просмотрите соответствующие сообщения на стороне или найдите лучшие методы С# для шаблона Dispose (docs на IDisposable
объясните это довольно хорошо IIRC.)
Ответ 2
Короткий ответ - "нет". Более подробные ответы можно найти в моих ответах на "Неправильная практика зависит от сборщика мусора .NET" и "Что произойдет, если я не вызываю Dispose()"