Все ответы (более или менее) правильны, вот пример:
static void Test()
{
using (DisposeImplementation di = new DisposeImplementation())
{
// Do stuff with di
}
}
Ручной вызов Dispose
также будет работать, но преимущество оператора using
заключается в том, что объект также будет удален при выходе из блока управления из-за возникновения исключения.
Вы можете добавить финализатор, который обрабатывает удаление ресурсов в случае, если кто-то «забудет» использовать интерфейс IDisposable:
public class DisposeImplementation : IDisposable
{
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// get rid of managed resources
}
// get rid of unmanaged resources
}
~DisposeImplementation()
{
Dispose(false);
}
}
См. этот вопрос для получения дополнительной информации. Однако это просто компенсирует людей, которые неправильно используют ваш класс :) Я предлагаю вам добавить большой толстый Debug.Fail()
вызов в Finalizer, чтобы предупредить разработчика об их ошибке.
Если вы решите реализовать шаблон, вы увидите, что GC.Collect()
вызовет удаление.