У меня есть несколько основных вопросов о Dispose Pattern в C#.Конкретные вопросы о C# Dispose Pattern
В следующем фрагменте кода, который, как представляется, является стандартным способом реализации шаблона удаления, вы заметите, что управляемые ресурсы не обрабатываются, если утилизация ложна. Как и когда они обрабатываются? Сможет ли GC прийти и обработать управляемые ресурсы позже? Но если это так, то что делает вызов GG.SuppressFinalize (this)? Может ли кто-нибудь дать мне пример утилизации управляемых ресурсов? Наступает развязка событий. Что-нибудь еще? Способ написания паттерна, кажется, что они будут удалены (позже), если вы ничего не сделали в разделе «если (распоряжение)». Комментарии?
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Dispose managed resources.
}
// There are no unmanaged resources to release, but
// if we add them, they need to be released here.
}
disposed = true;
// If it is available, make the call to the
// base class's Dispose(Boolean) method
base.Dispose(disposing);
}
// implements IDisposable
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
Верно ли то, что я читал о блокировках в Dispose (BOOL) в этой теме, How do I implement the dispose pattern in c# when wrapping an Interop COM Object?? В нем говорится: «Мета-мета-комментарий - также важно, чтобы вы никогда не приобретали блокировки или не использовали блокировку во время вашей неуправляемой очистки». Почему? Это относится и к неуправляемым ресурсам?
Наконец, делает ли когда-либо реализацию финализатора (~ MyClass() на C#) без реализации IDisposable? Я считаю, что где-то читал, что финализаторы и IDisposable не нужны (или желательно), если нет неуправляемых ресурсов. Тем не менее, я вижу использование финализатора без IDisposable в некоторых примерах (см: http://www.codeproject.com/KB/cs/idisposable.aspx как один из примеров) Спасибо, Dave
Спасибо за все замечательные ответы всем! К сожалению, я могу отметить только один ответ. – Dave