Рассмотрим следующий код:
namespace DisposeTest
{
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Calling Test");
Test();
Console.WriteLine("Call to Test done");
}
static void Test()
{
DisposeImplementation di = new DisposeImplementation();
}
}
internal class DisposeImplementation : IDisposable
{
~DisposeImplementation()
{
Console.WriteLine("~ in DisposeImplementation instance called");
}
public void Dispose()
{
Console.WriteLine("Dispose in DisposeImplementation instance called");
}
}
}
Dispose просто не вызывается, даже если я поставил цикл ожидания после вызова Test();
. Так что совсем отстой. Я хочу написать класс, который прост и очень прост в использовании, чтобы убедиться, что все возможные ресурсы очищены. Я не хочу передавать эту ответственность пользователю моего класса.
Возможное решение: используйте using
или вызовите Dispose самостоятельно (в основном то же самое). Могу ли я заставить пользователя использовать использование? Или я могу заставить вызов dispose быть вызванным?
Вызов GC.Collect();
после Test();
тоже не работает.
Помещение di
в null
не вызывает Dispose. Деконструктор DOES работает, поэтому объект деконструируется, когда он выходит из Test()
Хорошо, ребята, теперь ясно!
Спасибо всем за ваши ответы! Я добавлю предупреждение в комментарии!