Ничего себе.Здесь много вопросов!
Когда я ДОЛЖЕН использовать IDisposable?Только когда у меня есть неуправляемые ресурсы?
IDisposable
обычно обычно используется для очистки ресурсов, но это не обязательно все, для чего это хорошо.Это общая схема уведомления объекта потребления о том, что вы закончили с ним.Одним из примеров является таймер:
using(var timer = new MyTimer())
{
//do some stuff
}
В этом случае вызов Dispose
не обязательно освобождает какие-либо ресурсы, это просто удобный и последовательный (два ключа для шаблона!) Способ сообщить таймеру«Хорошо, я с тобой закончил», и таймер может остановить отсчет времени и, возможно, записать время где-нибудь.
Еще одно хорошее эмпирическое правило - если по какой-то причине вам нужен финализаторобычно должен также предоставить IDisposable
доступ к той же самой подпрограмме, чтобы потребительский класс мог предпочесть завершить класс раньше, а не ждать в GC.
Какие существуют варианты шаблона dispose и почемуони различаются?
Существует только один реальный "конкретный" тип реализации IDisposable
, о котором я знаю - шаблон Finalize / Dispose:
public class MyClass : IDisposable
{
void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
}
~MyClass()
{
Dispose(false);
}
}
Что такое общие неуправляемые ресурсы, о которых мне следует знать?
Все, что реализует IDisposable
, особенно в библиотеках .NET, должно иметь дескрипторы неуправляемых ресурсов и шо.должен быть расположен.Обычно через них вы получаете доступ только к неуправляемым ресурсам.Если нет, то вы будете знать - обычно сборка драйвера или что-то в этом роде.
Это когда-либо неправильно или вводит в заблуждение внедрение IDisposable?
Может быть бессмысленно злоупотреблять им, но не наносит непосредственного вреда.
Если вызовы Dispose когда-либо объединяются в цепочку
Класс должен располагать только теми IDisposable, которые он создает внутри.Если у него есть одноразовые зависимости, которые были введены или находятся за пределами класса, вы никогда не должны избавляться от них.